這種問題大概也是學 OOP 的人最會問的十大 FAQ 之一,介面和抽象類別都有對其實作者與衍生類別有相當的強制力,因此如果只是要強制實作者必定要實作某些方法或屬性的話,其實這兩種都能用,不過實際上在用時還是有差異的,這些差異要看你的原始目的以及強制力的範圍而定。
什麼時候會用到介面,其實很簡單。
只要你和對方是白紙黑字,而且雙方都不會在背後亂搞的情況,就要使用介面。
介面的行為端看實作品而定,另一方對實作品是只有使用權,沒有干涉的權利 (除非介面中有開放允許其他程式干涉的入口,例如委派),而實作品也可以專心對介面履行應有的承諾,所以在介面之下,雙方是互不相干的個體,只有在使用介面時才會有關聯,所以使用介面不會造成耦合性,雙方若想要再各自和其他物件關聯,只要在滿足介面的規範下,要怎麼做都可以 (不過這裡面會涉及一些 Dependency Injection 的使用,在這就不提了)。
那什麼時候會用到抽象類別呢?
明明要求人家做事,卻又想從中插一手的情況。
我們在抽象類別內可以實作自己的行為,而在需要衍生品實作時才會需要用到 abstract/virtual,所以衍生品基本上沒有抽象類別提供的環境是無法生存的,抽象類別和衍生類別間具有高度的耦合性,不像介面是幾乎沒有耦合性,所以一旦使用了抽象類別,就別想要把抽象類別和衍生類別的耦合度拆開。當然有些人會覺得說我可以實作一個只有 abstract 成員的抽象類別啊,但老實說與其用這種作法,不如直接用介面來得划算。
好久沒發文了,簡單廢話一下 :)