來源:
這篇真的寫得很棒,大家一定要點進去看看,並自己動手寫Code !!
而我自己寫一篇只是為了建檔,方便日後自己觀看用,裡面的Code都是基於上面教學文寫的,自己只是加了一個AutoDoor的功能而已。
- 建立一個abstract的Door類別,裡面有Open(開門)與Close(關門)這兩個虛擬方法可以用
1234567891011abstract class Door{public virtual void Open(){Console.WriteLine("Open Door");}public virtual void Close(){Console.WriteLine("Close Door");}}
- 建立一個HorizontalDoor類別,它繼承了原先的Door,所以它也有Open與Close這兩個方法可以用
1class HorizontalDoor : Door { }
- 建立一個VerticalDoor類別,它也繼承了Door,可是我在裡面override了原先的Open與Close,另外實作其方法
1234567891011class VerticalDoor : Door{public override void Open(){Console.WriteLine("Open vertically");}public override void Close(){Console.WriteLine("Close vertically");}}
- 建立一個IAlarm介面,裡面定義了Alert這個方法
1234interface IAlarm{void Alert();}
- 建立一個Alarm類別,它繼承了IAlarm,並在裡面實作Alert
1234567class Alarm : IAlarm{public void Alert(){Console.WriteLine("Ring ~~");}}
- 建立一個AlarmDoor類別,它繼承了Door,同時在裡面使用了Alarm類別的Alert方法
1234567891011121314class AlarmDoor : Door{private IAlarm _alarm;public AlarmDoor(){_alarm = new Alarm();}public void Alert(){_alarm.Alert();}}
- 建立一個AutoAlarmDoor類別,它繼承了AlarmDoor,並覆寫了原本的Open方法,裡面呼叫base.Open方法並接著呼叫Alert方法
12345678class AutoAlarmDoor : AlarmDoor{public override void Open(){base.Open();Alert();}}
- 建立一個DoorController類別,這個類別是用來控制管理所有的Door
1234567891011121314151617class DoorController{protected List<Door> _dootList = new List<Door>();public void AddDoor(Door Door){_dootList.Add(Door);}public void OpenDoor(){foreach (var item in _dootList){item.Open();}}}
- 完成 !!
123456789101112static void Main(string[] args){DoorController dc = new DoorController();dc.AddDoor(new HorizontalDoor());dc.AddDoor(new VerticalDoor());dc.AddDoor(new AlarmDoor());dc.AddDoor(new AutoAlarmDoor());dc.OpenDoor();Console.ReadLine();}
- 執行結果
- 注意事項
- abstract method 不會有程式內容
- abstract method 繼承後,一定要 override
- virtual method 一定要有程式內容
- 宣告為 virtual 的 method,繼承後才可以進行 override
- 設定為 virtual 的 method,沒有一定要 override