[C#] 利用 interface(介面) abstract(抽象) override(覆寫) inherit(繼承) 實作簡單範例

來源:

  1. (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
  2. [C#] abstract 和 virtual 函數的差異

 

這篇真的寫得很棒,大家一定要點進去看看,並自己動手寫Code !!
而我自己寫一篇只是為了建檔,方便日後自己觀看用,裡面的Code都是基於上面教學文寫的,自己只是加了一個AutoDoor的功能而已。

 


 

  1. 建立一個abstract的Door類別,裡面有Open(開門)與Close(關門)這兩個虛擬方法可以用
    abstract class Door
    {
        public virtual void Open()
        {
            Console.WriteLine("Open Door");
        }
        public virtual void Close()
        {
            Console.WriteLine("Close Door");
        }
    }
    

     

  2. 建立一個HorizontalDoor類別,它繼承了原先的Door,所以它也有Open與Close這兩個方法可以用
    class HorizontalDoor : Door { }
    

     

  3. 建立一個VerticalDoor類別,它也繼承了Door,可是我在裡面override了原先的Open與Close,另外實作其方法
    class VerticalDoor : Door
    {
        public override void Open()
        {
            Console.WriteLine("Open vertically");
        }
        public override void Close()
        {
            Console.WriteLine("Close vertically");
        }
    }
    

     

  4. 建立一個IAlarm介面,裡面定義了Alert這個方法
    interface IAlarm
    {
        void Alert();
    }
    

     

  5. 建立一個Alarm類別,它繼承了IAlarm,並在裡面實作Alert
    class Alarm : IAlarm
    {
        public void Alert()
        {
            Console.WriteLine("Ring ~~");
        }
    }
    

     

  6. 建立一個AlarmDoor類別,它繼承了Door,同時在裡面使用了Alarm類別的Alert方法
    class AlarmDoor : Door
    {
        private IAlarm _alarm;
    
        public AlarmDoor()
        {
            _alarm = new Alarm();
        }
    
        public void Alert()
        {
            _alarm.Alert();
        }
    }
    

     

  7. 建立一個AutoAlarmDoor類別,它繼承了AlarmDoor,並覆寫了原本的Open方法,裡面呼叫base.Open方法並接著呼叫Alert方法
    class AutoAlarmDoor : AlarmDoor
    {
        public override void Open()
        {
            base.Open();
            Alert();
        }
    }
    

     

  8. 建立一個DoorController類別,這個類別是用來控制管理所有的Door
    class 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();
            }
        }
    }
    

     

  9. 完成 !!
    static 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();
    }

     

  10. 執行結果
    2016-09-07 23_06_31-file____C__Users_Minsheng_Desktop_ConsoleApplication_Door_ConsoleApplication_Doo

 

  • 注意事項
    1. abstract method 不會有程式內容
    2. abstract method 繼承後,一定要 override
    3. virtual method 一定要有程式內容
    4. 宣告為 virtual 的 method,繼承後才可以進行 override
    5. 設定為 virtual 的 method,沒有一定要 override

 



這裡的資訊對您有用嗎?歡迎斗內給我