什么是.NET接口?什么是.NET抽象類?
什么是.NET接口?
接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR允許接口可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。但是注意:C#中不能包含任何靜態成員。一個類可以實現多個接口,當一個類繼承某個接口時,它不僅要實現該接口定義的所有方法,還要實現該接口從其他接口中繼承的所有方法。
定義方法為:
- public interface System.IComparable
- {
- int CompareTo(object o);
- }
- public class TestCls: IComparable
- {
- public TestCls()
- {
- }
- private int _value;
- public int Value
- {
- get { return _value; }
- set { _value = value; }
- }
- public int CompareTo(object o)
- {
- //使用as模式進行轉型判斷
- TestCls aCls = o as TestCls;
- if (aCls != null)
- {
- //實現抽象方法
- return _value.CompareTo(aCls._value);
- }
- }
- }
什么是.NET抽象類?
抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能實例化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實現抽象方法由overriding方法來實現。
定義方法為:
- ///
- /// 定義抽象類
- ///
- abstract public class Animal
- {
- //定義靜態字段
- static protected int _id;
- //定義屬性
- public abstract static int Id
- {
- get;
- set;
- }
- //定義方法
- public abstract void Eat();
- //定義索引器
- public string this[int i]
- {
- get;
- set;
- }
- ///
- /// 實現抽象類
- ///
- public class Dog: Animal
- {
- public static override int Id
- {
- get {return _id;}
- set {_id = value;}
- }
- public override void Eat()
- {
- Console.Write("Dog Eats.")
- }
- }
.NET接口和.NET抽象類的相同點和不同點
了解了什么是.NET接口和.NET抽象類,我們來看看兩者的異同之處。
相同點
都不能被直接實例化,都可以通過繼承實現其抽象方法。
都是面向抽象編程的技術基礎,實現了諸多的設計模式。
不同點
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
接口是一組行為規范;抽象類是一個不完全的類,著重族的概念。
接口可以用于支持回調;抽象類不能實現回調,因為繼承不支持。
接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。
接口可以作用于值類型和引用類型;抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。
通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優略。在實際的編程實踐中,我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都來源于經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請繼續。
.NET接口和.NET抽象類的規則與場合
請記住,面向對象思想的一個最重要的原則就是:面向接口編程。
借助接口和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象編程。
抽象類應主要用于關系密切的對象,而接口最適合為不相關的類提供通用功能。
接口著重于CAN-DO關系類型,而抽象類則偏重于IS-A式的關系;
接口多定義對象的行為;抽象類多定義對象的屬性;
接口定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的接口都定義為public,原因就不必多說了。
“接口不變”,是應該考慮的重要因素。所以,在由接口增加擴展時,應該增加新的接口,而不能更改現有接口。
盡量將接口設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個公共方法。
接口名稱前面的大寫字母“I”是一個約定,正如字段名以下劃線開頭一樣,請堅持這些原則。
在接口中,所有的方法都默認為public。
如果預計會出現版本問題,可以創建“抽象類”。例如,創建了狗(Dog)、雞(Chicken)和鴨(Duck),那么應該考慮抽象出動物(Animal)來應對以后可能出現風馬牛的事情。而向接口中添加新成員則會強制要求修改所有派生類,并重新編譯,所以版本式的問題***以抽象類來實現。
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現。
對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被實例化。
在抽象方法聲明中不能使用 static 或 virtual 修飾符。
【編輯推薦】