iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

C# 從入門到WebApi系列 第 14

[Day14] 論物件導向三本柱之四(依賴反向) 順便介紹介面

  • 分享至 

  • xImage
  •  

不是說三本柱嗎
怎麼會有4個
就跟四天王有五個一樣

在開始之前我們來聊聊介面

介面其實跟抽象類別很像
都只宣告方法名稱 傳入類型 與 傳回類型
介面的使用焦點是放在操作物件這件事情上
而繼承則是把重點放在屬性與方法的重複使用

我們先來看看怎麼宣告介面
我們使用interface 關鍵字來宣告
通常 介面跟class 一樣會另外拉出一個檔案來寫
介面名稱通常會用大寫I開頭
通常介面不會放在class下面 而是跟class一樣在namespace下面

public interface 介面名稱{
    public 傳入類型 方法名稱(傳入參數);//指宣告方法不實作 (沒有大括弧{})
}

我們繼續拿前幾天的例子來說明
我們有動物類別 狗勾類別,跟鳥鳥類別他們都繼承至動物類別
但是我會稍微修改下鳥鳥類別
讓他多一個fly的方法
Animal.cs

using System;

namespace Inheritance
{
    public abstract class Animal
    {
        protected string Name;

        public virtual void Move()
        {
            Console.WriteLine("Move");
        }

        public void GetName()
        {
            Console.WriteLine($"動物的名字是{Name}");
        }

        public abstract void Eat();
    }
}

Dog.cs

using System;

namespace Inheritance
{
    public class Dog : Animal
    {
        public Dog()
        {
            Name = "Dog";
        }

        public void WagTail()
        {
            Console.WriteLine($"{Name}搖了搖尾巴");
        }

        public override void Eat()
        {
            Console.WriteLine($"{Name}吃肉");
        }
    }
}

Bird.cs

using System;

namespace Inheritance
{
    public class Bird:Animal
    {
        public Bird()
        {
            Name = "Bird";
        }

        public override void Move()
        {
            Console.WriteLine("Jump");
        }

        public override void Eat()
        {
            Console.WriteLine($"{Name}吃蟲");
        }
        
        public void fly(){
            Console.WriteLine("阿罵你金罵低叨威 我在天上飛");
        }
    }
}

如果今天我們想讓狗勾跟鳥鳥一樣飛起來
我們可以讓狗勾實作IFly這個介面

public interface IFly{
    public void Fly();
}

跟繼承一樣
我們使用:來實作介面
用,隔開要繼承與要實做的介面
C#可以多重實作介面 但只能單一繼承
很重要所以再提一次

Dog.cs

using System;

namespace Inheritance
{
    public class Dog : Animal,IFly
    {
        public Dog()
        {
            Name = "Dog";
        }

        public void WagTail()
        {
            Console.WriteLine($"{Name}搖了搖尾巴");
        }

        public override void Eat()
        {
            Console.WriteLine($"{Name}吃肉");
        }
        
        public override void Fly()
        {
            Console.WriteLine($"開靈車甩尾棺材飛 媽你看阿罵在天上飛");    
        }
    }
}

Main

void Main(){
    Dog dog = new Dog();//因為animal沒有實作IFly所以不會飛 
    dog.fly();
}
//開靈車甩尾棺材飛 媽你看阿罵在天上飛

我們成功讓狗勾飛起來了

看起來我不要IFly介面也能讓狗勾飛起來阿

一樣扯到介面隔離原則(ISP)原則
事實上介面也是一種"抽象"
正如前幾篇所言
寫成是要針對抽象來寫
在後面幾篇介紹完solid應該就能有比就深刻的感覺
(所以可以先擱著)

依賴反向

這一個部分其實會在solid的最後一項d(Dependency inversion principle)仔細介紹
但是畢竟他是三本柱之一
所以我還是要加減提一下
我們先來看看這張
(偽)UML圖
https://ithelp.ithome.com.tw/upload/images/20200914/20109549y3EGfE43J4.png
在物件依賴圖裡面
當A使用到B class
我們稱A依賴B
人吃蘋果
所以人依賴蘋果

https://ithelp.ithome.com.tw/upload/images/20200914/201095490t9T6rRo3V.png

今天我們加了一個食物的介面
讓人去依賴食物介面
蘋果因為實作食物介面
所以也依賴食物介面

依賴關係就反向了

這邊不會仔細提反向了要幹嘛 會留在DIP做講解

閒聊

雖然字數變少了
但是忙到有點想棄坑了OTZ
不過頭都洗一半了
就乖乖洗完吧
共勉之


上一篇
[Day13] 論物件導向三本柱之三(多形)
下一篇
[Day15] 淺出SOLID 關於單一職責原則(SRP)
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言