什麼是接口?
接口是包含一組虛方法的抽象類型,其中每一種方法都有名稱、參數和返回值。
接口方法不能包含任何實現,clr允許接口可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常熟。但不能包含任何靜態成員。
一個類可以實現多個接口,當一個類繼承某個接口時,它不僅要實現該接口定義的多有方法,還要實現該接口從其它接口中繼承的所有方法。
什麼是抽象類?
抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。
抽象類不能實例化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被封裝。如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明爲抽象類。另外,實現抽象方法由override方法來實現。
接口與抽象類有什麼相同點和不同點
相同點:
1、都不能被直接實例化,都可以通過繼承實現其抽象方法。
2、都是面向抽象編程技術基礎,實現了諸多的設計模式。
不同點:
1、接口支持多繼承;抽象類不能實現多繼承。
2、接口只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
3、接口是一組行爲規範;抽象類是一個不完全的類。
4、接口可以用於支持回調;抽象類不能實現回調,因爲繼承不支持。
5、接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。
7、接口可以作用於值類型和引用類型;抽象類只能作用於引用類型。例如,struct就可以繼承接口,而不能繼承類。
規則與場合
1、面向對象思想的一個重要的原則就是面向接口編程。
2、藉助接口和抽象類,23個設計模式中的很多思想被巧妙的實現了,其精髓簡單的來說就是:面向抽象編程。
3、抽象類應主要用於關係密切的對象,而接口適合用於爲不相關的類提供功能。
4、接口着重於Can-Do關係型,而抽象類則偏重於Is-A式的關係;
5、接口多定義對象的行爲;抽象類多定義對象的屬性;
6、接口定義可以使用public、protected、internal和private修飾符,但是幾乎所有的接口都定義爲public。
7、在接口中,多有的方法都默認爲public。
8、“接口不變”,是應該考慮的重要因素。所以,再由接口增加擴展時,應該增加新的接口,而不能更改現有的接口。
9、儘量將接口設計成功能單一的功能模塊,以.NET Framework爲例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個公共方法。
10、接口名稱前面的大寫字母“I”是一個約定。
11、如果預計會出現版本問題們可以創建“抽象類”。例如,創建了狗(Dog)、雞(Chicken)和鴨(Duck),那麼應該考慮抽象出動物(Animal)來應對以後可能出現風馬牛的事情。而向接口中添加新成員則會強制要求修改所有派生類,並重新編譯,所以版本式的問題最好以抽象類來實現。
12、從抽象派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問其的實現。
13、對抽象類不能使用new關鍵字,也不能被密封,原因就是抽象類不能被實例化。
14、在抽象類聲明中不能使用static或virtual修飾符。