Monday, April 12, 2010

(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) - 真 OO无双 之 真乱舞书 - 博客园

(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) - 真 OO无双 之 真乱舞书 - 博客园

為什麼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就搞定了,概念反而比較簡單。


當寫程式會用interface時,已經進步到了另外一個境界了,以下是我對interface的一些感悟,歡迎指證...。

用於物件與物間合作:物件要合作,就必須呼叫其他物件的member function,怎麼確保其他物件有此member function而且又loose coupling呢?所以定義了interface,凡要參予合作的物件,就必須實做了該interface才能合作,而個物件又能保持其獨立而不互相影響,其間的關係僅止於interface而已,如observer pattern就是典型的應用,這是一種"like a"的應用。
這是我目前所了解的interface,以後還會隨時更新,歡迎指證。

轉貼於真 OO无双 之 真乱舞书 - 博客园

Motion Offense 教學計劃 (1)《空手跑位的應用》 @ 籃球一隅間拾得 :: 痞客邦 PIXNET ::

Motion Offense 教學計劃 (1)《空手跑位的應用》 @ 籃球一隅間拾得 :: 痞客邦 PIXNET ::

碳水化合物對籃球運動員的重要性 @ 籃球一隅間拾得 :: 痞客邦 PIXNET ::

碳水化合物對籃球運動員的重要性 @ 籃球一隅間拾得 :: 痞客邦 PIXNET ::

##HIDEME##