本文將介紹如下內容:程序員
• 面向對象思想:多態編程
• 接口設計模式
• 抽象類ide
1. 引言函數
在我以前的一篇post《抽象類和接口的誰是誰非》中,和同事管偉的討論,獲得不少朋友的關注,由於是不成體系的論道,因此給你們瞭解形成不便,同時關於這個主題的系統性理論,我認爲也有必要作以總結,所以纔有了本篇的新鮮出爐。同時,我將把上貼中的問題順便也在此作以交代。post
2. 概念引入學習
接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR容許接口能夠包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。可是注意:C#中不能包含任何靜態成員。一個類能夠實現多個接口,當一個類繼承某個接口時,它不只要實現該接口定義的全部方法,還要實現該接口從其餘接口中繼承的全部方法。this
定義方法爲:設計
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); } } }
抽象類提供多個派生類共享基類的公共定義,它既能夠提供抽象方法,也能夠提供非抽象方法。抽象類不能實例化,必須經過繼承由派生類實現其抽象方法,所以對抽象類不能使用new關鍵字,也不能被密封。若是派生類沒有實現全部的抽象方法,則該派生類也必須聲明爲抽象類。另外,實現抽象方法由overriding方法來實現。對象
定義方法爲:
/// <summary> /// 定義抽象類 /// </summary> abstract public class Animal { //定義靜態字段 protected int _id; //定義屬性 public abstract int Id { get; set; } //定義方法 public abstract void Eat(); //定義索引器 public string this[int i] { get; set; } } /// <summary> /// 實現抽象類 /// </summary> public class Dog: Animal { public override int Id { get {return _id;} set {_id = value;} } public override void Eat() { Console.Write("Dog Eats.") } }
3. 相同點和不一樣點
3.1 相同點
3.2 不一樣點
經過相同與不一樣的比較,咱們只能說接口和抽象類,各有所長,但無優略。在實際的編程實踐中,咱們要視具體狀況來酌情量才,可是如下的經驗和積累,或許能給你們一些啓示,除了個人一些積累以外,不少都來源於經典,我相信經得起考驗。因此在規則與場合中,咱們學習這些經典,最重要的是學以至用,固然我將以一家之言博你們之笑,看官請繼續。
3.3 規則與場合
以上的規則,我就厚顏無恥的暫定爲T14條吧,寫的這麼累,就當一時的獎賞吧。你們也能夠互通有無,我將及時修訂。
4. 經典示例
4.1 絕對經典
.NET Framework是學習的最好資源,有意識的研究FCL是每一個.NET程序員的必修課,關於接口和抽象類在FCL中的使用,我有如下的建議:
4.2 別樣小菜
下面的實例,由於是個人理解,所以給經典打上「相對」的記號,至於何時晉升爲「絕對」,就看我在.NET追求的路上,是否可以一如既往的如此執着,所以我將把相對重構到絕對爲止(呵呵)。 本示例沒有闡述抽象類和接口在設計模式中的應用,由於那將是另外一篇有討論價值的文本,本文着眼與概念和原則的把握,可是真正的應用來自於具體的需求規範。
設計結構如圖所示:
1. 定義抽象類
public abstract class Animal { protected string _name; //聲明抽象屬性 public abstract string Name { get; } //聲明抽象方法 public abstract void Show(); //實現通常方法 public void MakeVoice() { Console.WriteLine("All animals can make voice!"); } }
2. 定義接口
public interface IAction { //定義公共方法標籤 void Move(); }
3. 實現抽象類和接口
public class Duck : Animal, IAction { public Duck(string name) { _name = name; } //重載抽象方法 public override void Show() { Console.WriteLine(_name + " is showing for you."); } //重載抽象屬性 public override string Name { get { return _name;} } //實現接口方法 public void Move() { Console.WriteLine("Duck also can swim."); } } public class Dog : Animal, IAction { public Dog(string name) { _name = name; } public override void Show() { Console.WriteLine(_name + " is showing for you."); } public override string Name { get { return _name; } } public void Move() { Console.WriteLine(_name + " also can run."); } }
4. 客戶端實現
public class TestAnmial { public static void Main(string [] args) { Animal duck = new Duck("Duck"); duck.MakeVoice(); duck.Show(); Animal dog = new Dog("Dog"); dog.MakeVoice(); dog.Show(); IAction dogAction = new Dog("A big dog"); dogAction.Move(); } }
5. 他山之石
正所謂真理是你們看出來的,因此將園子裏有創新性的觀點潛列於此,一是感謝你們的共享,二是完善一家之言的不足,但願可以將領域造成知識,受用於我,受用於衆。
最後,MSDN的建議是:
6. 結論
接口和抽象類,是論壇上、課堂間討論最多的話題之一,之因此將這個老話題拿出來再議,是由於從個人體會來講,深入的理解這兩個面向對象的基本內容,對於盤活面向對象的抽象化編程思想相當重要。本文基本概況了接口和抽象類的概念、異同和使用規則,從學習的觀點來看,我認爲這些總結已經足以表達其核心。可是,對於面向對象和軟件設計的深刻理解,仍是創建在不斷實踐的基礎上,Scott說本身天天堅持一個小時用來寫Demo,那麼咱們是否是更應該勤於鍵盤呢。對於接口和抽象類,請多用而知其然,多想而知其奧吧。