作為一個在學校學習C++, 出了校門想要找一份C++程序員的工作結果被公司要求搞C#工程的苦逼. 我終於走上了一條倚靠微軟的不歸路...
不過我對學東西是不排斥的. 所以買了本C#與.NET4高級程序設計開始入門.
本來打算一天看100頁, 8天內搞定語法部分, 然后投身WPF的. 誰知道客戶各種翔一樣的要求和突如其來的大量日語夜間培訓課程讓我的自由時間一下子從東北大饅頭縮到了壓縮餅干級別.
一周過去了, 我步履緩慢地來到了接口.
--------------華麗麗的分割線-----------------
昨晚上部門長從代理部門長升到了部門長, 請客去吃飯, 吃飯的時候有個朋友鬧了個笑話. 因為鳥和蝙蝠都是會飛的, 所以他竟然把鳥也當成有雷達功能的了.
於是我想到一個問題: 鳥真的會飛嗎?
首先, 創建一個類"鳥"
public class 鳥 { public string Name { get; set; } public virtual void Show() { Console.WriteLine("我是一只鳥"); } }
接着, 創建"鳥"的子類, "烏鴉", "麻雀", "雞"(有人說雞不會飛不是鳥, 鴕鳥笑了), "鴕鳥"(於是他改口說雞和鴕鳥都不是鳥, 好吧, 請找出他們的膀胱來)
class 烏鴉:鳥 { public override void Show() { Console.WriteLine("我是一只烏鴉"); }
public void fly() { Console.WriteLine("我是一只烏鴉, 我能飛"); } } class 鴿子 : 鳥 { public override void Show() { Console.WriteLine("我是一只鴿子"); }
public void fly() { Console.WriteLine("我是一只鴿子, 我能飛"); } } class 雞 : 鳥 { public override void Show() { Console.WriteLine("我是一只雞"); } } class 鴕鳥 : 鳥 { public override void Show() { Console.WriteLine("我是一只鴕鳥"); } }
於是我們有了五個類, 創建一個鳥的數組, 里面分別放入四個子類的對象.
鳥[] birds = new 鳥[] { new 烏鴉(), new 鴕鳥(), new 鴿子(), new 雞()};
問題, 請問如何取得數組中所有會飛的鳥?
看上面的代碼, 是有fly方法的就是會飛的, 那怎么判斷一個類是否含有fly方法呢?
辦法總是有的, 除了某種高深的能夠判斷類方法是否存在的方法外, 我們可以先把鳥類分成兩類, 一類叫"會飛的鳥", 一類叫"不會飛的鳥".
沒辦法, 學校學的C++, 想出此種拙計...
可是, 問題拓展了, 因為並不只有鳥才會飛, 飛機也會飛, 蝙蝠也會飛. 新問題: 找出object數組中所有會飛的object.
腫么辦?
反射是什么東西? 還沒學到, 不清楚.
這個時候該引入接口了.
在C++學習的時候, 暴露給外界的接口就是大家共通的一個純虛函數, 通常定義在一個由純虛函數構成的類中, 叫做抽象類.
C#中不支持多個父類, 因為邏輯上程序員對OO的理解就是一棵大樹, 樹往下走可以有很多分支, 往上走, 只有一條路. 這個也符合生物學等等的門綱目科屬的划分規則.
而對於多個類都能實現的動作, C#中就交給了接口去處理. 接口就相當於C++中一個由純虛函數構成的抽象類. 我就這么去理解了.
定義一個Fly的接口
public interface IFly { void Fly(); }
然后讓上面的幾個能飛的繼承這個接口, 把fly方法改為Fly方法就可以了.
測試Main函數
static void Main(string[] args) { 鳥[] birds = new 鳥[] { new 烏鴉(), new 鴕鳥(), new 鴿子(), new 雞()}; foreach(鳥 bird in birds) { if (bird is IFly) { (bird as IFly).Fly(); } } Console.ReadLine(); }
如果有其他的類也能飛的話, 只要繼承IFly接口, 然后實現飛行Fly方法, 就能通過as或是is關鍵字判斷出來了, 很方便不是.
當然也可以直接強轉(IFly)bird, 不會fly的就會拋出一個InvalidCastException異常.