(原創) 為什麼C#、Java需要提供interface? (C/C++) (.NET) (C#) (Java)
Abstract
很多人學習C#、Java,都被interface和abstract class所搞混,不知什麼時候該用interface,什麼時候該用abstract class,但學C++時卻很單純,因為C++只用一套virtual function和多重繼承就全部解決了。
Introduction
物件導向的三個特色:封裝、繼承、多型,其中最重要的多型,C++是靠繼承和Dynamic Binding達成,Dynamic Binding的前提就是virtual function。interace概念如同contract,是個只有定義但沒有實做的class,C++中使用abstract base class拿達成(請參考(原創) 如何使用abstract base class模擬interface? (C/C++)),一個class可能必須實做多個contract,C++因為有多重繼承機制,所以使用class多重繼承即可實做多個interface。
但C#、Java都沒有多重繼承,所以無法使用class繼承來達到同時實做多個interface的要求,只好另外提出了interface概念,當然這和abstract class功能有所重複,所以很多C#的書上說,interface和abstract class的差別在於,一個class可以同時實做多個interface,但只能繼承一個abstract class。
所以由此看出,interface只是abstract class的一個特例,且是由於C#、Java本身沒有多重繼承之下不得不的產物,反而搞得interface和abstract class之間的定位模糊不清,這點C++反而比較清楚,純定義interface請用absract base class,全部使用pure virtual function,一個class實做多個abstract base class也能用多重繼承做出;若想做出C#那種abstract class,只要在abstract base class上,另外加上virtual function即可,沒有什麼abstract class概念。
Conclusion
C#、Java身為比C++更新的語言,很多地方的確簡化了C++,但有些地方卻越搞越複雜,interface和abstract class即是一例,原罪就是C#、Java沒有多重繼承,其他如C#還分virtual function和abstract function,真是麻煩!!C++一律都是virtual function就搞定了,概念反而比較簡單。
See Also
(原創) 如何使用abstract base class模擬interface? (C/C++)
(原創) 我對interface的理解 (C/C++) (OO) (Design Pattern)