[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(關門)這兩個虛擬方法可以用
1
2
3
4
5
6
7
8
9
10
11
12

abstract class Door
{
public virtual void Open()
{
Console.WriteLine("Open Door");
}
public virtual void Close()
{
Console.WriteLine("Close Door");
}
}

 

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

class HorizontalDoor : Door { }

 

  1. 建立一個VerticalDoor類別,它也繼承了Door,可是我在裡面override了原先的Open與Close,另外實作其方法
1
2
3
4
5
6
7
8
9
10
11
12

class VerticalDoor : Door
{
public override void Open()
{
Console.WriteLine("Open vertically");
}
public override void Close()
{
Console.WriteLine("Close vertically");
}
}

 

  1. 建立一個IAlarm介面,裡面定義了Alert這個方法
1
2
3
4
5

interface IAlarm
{
void Alert();
}

 

  1. 建立一個Alarm類別,它繼承了IAlarm,並在裡面實作Alert
1
2
3
4
5
6
7
8

class Alarm : IAlarm
{
public void Alert()
{
Console.WriteLine("Ring ~~");
}
}

 

  1. 建立一個AlarmDoor類別,它繼承了Door,同時在裡面使用了Alarm類別的Alert方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

class AlarmDoor : Door
{
private IAlarm _alarm;

public AlarmDoor()
{
_alarm = new Alarm();
}

public void Alert()
{
_alarm.Alert();
}
}

 

  1. 建立一個AutoAlarmDoor類別,它繼承了AlarmDoor,並覆寫了原本的Open方法,裡面呼叫base.Open方法並接著呼叫Alert方法
1
2
3
4
5
6
7
8
9

class AutoAlarmDoor : AlarmDoor
{
public override void Open()
{
base.Open();
Alert();
}
}

 

  1. 建立一個DoorController類別,這個類別是用來控制管理所有的Door
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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();
}
}
}

 

  1. 完成 !!
1
2
3
4
5
6
7
8
9
10
11
12
13

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();
}

 

  1. 執行結果
    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
       
  • 原始碼:https://github.com/shuangrain/ConsoleApplication_Door