iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Software Development

C# 學習之路系列 第 8

[DAY7] C#基礎與實作(抽象類別.介面)

  • 分享至 

  • xImage
  •  

C# 程式基礎

  抽象類別(Abstract Class):
    在 C# 中用於定義一個不能實例化的類別,通常用作其他類別的基底類別。
    最重要的理念是隱藏工作細節,對於使用者而言,僅知道如何使用這些功能。
  介面(Interface):
    一個重要概念,用於定義一組抽象方法和屬性,但沒有提供實際的實作。
    類別可以實作一個或多個介面,以強制類別實現指定的方法和屬性。

抽象類別(Abstract Class):

  • 抽象類別使用 abstract 關鍵字來定義,通常包含一個或多個抽象成員(方法、屬性等)。
  • 一個抽象類別如果沒有子類別去繼承,是沒有功能的。
  • 抽象類別的抽象方法,必須有子類別覆寫此方法,如果沒有子類別重新定義,會有編譯錯誤。
  • 子類別必須實作所有在抽象類別中定義的抽象成員,否則子類別也必須被定義為抽象類別。
  • 抽象方法在抽象類別中只包含方法的簽名,而實際的方法實作由子類別提供,並使用 override 關鍵字實作。

假設我們正在建立一個動物分類系統,我們希望有不同種類的動物,例如哺乳動物和鳥類,並且每種動物都能發出聲音。我們可以使用抽象類別來定義通用的 Animal 類別,然後從它指派具體的動物類別。

  • 程式範例:
    // 定義抽象類別 Animal
    abstract class Animal {
        public string Name { get; set; }

        public Animal(string name) {
            Name = name;
        }

        // 定義抽象方法 MakeSound
        public abstract void MakeSound();
    }

    // 子類別,繼承抽象類別
    class Mammal : Animal {
        public Mammal(string name) : base(name) { }

        public override void MakeSound() {
            Console.WriteLine(Name + "是哺乳動物,發出哺乳動物的聲音。");
        }
    }

    // 子類別,繼承抽象類別
    class Bird : Animal {
        public Bird(string name) : base(name) { }

        public override void MakeSound() {
            Console.WriteLine(Name + "是鳥類,發出鳥類的聲音。");
        }
    }

    class Program {
        static void Main() {
            // 創建哺乳動物和鳥類物件
            Mammal lion = new Mammal("獅子");
            Bird eagle = new Bird("鷹");

            // 呼叫 MakeSound 方法
            lion.MakeSound(); // 輸出:獅子是哺乳動物,發出哺乳動物的聲音。
            eagle.MakeSound(); // 輸出:鷹是鳥類,發出鳥類的聲音。
        }
    }

在這個範例中,我們定義了一個抽象類別 Animal,它包含屬性 Name 和抽象方法 MakeSound。然後,我們從 Animal 派生了具體的哺乳動物和鳥類類別,並實作了 MakeSound 方法以模擬不同種類的動物發聲的行為。這樣我們就可以創建不同種類的動物,並呼叫它們的 MakeSound 方法來聽到它們的聲音。


介面(Interface):

  • 介面使用 interface 關鍵字來定義,它包含一組方法和屬性的聲明,但不提供實際的方法實作。
  • 介面是一種合約,它定義了類別必須實現的方法和屬性。當一個類別實作了一個介面,它必須提供介面中定義的所有成員的實作。
  • 類別可以實作多個介面,以實現多個合約。
  • 介面可以被其他介面繼承,以建立層次結構的介面。

  假設我們正在建立一個動物分類系統,我們希望不同種類的動物都能移動,並發出聲音。我們可以使用介面來定義通用的 IMovable 和 ISound 介面,然後讓動物類別實作這些介面。

  • 程式範例:
    // 定義移動介面
    interface IMovable {
        void Move();
    }

    // 定義發聲介面
    interface ISound {
        void MakeSound();
    }

    // 實作動物類別,同時實作 IMovable 和 ISound 介面
    class Animal : IMovable, ISound {
        public string Name { get; set; }

        public Animal(string name) {
            Name = name;
        }

        public void Move() {
            Console.WriteLine(Name + "正在移動。");
        }

        public void MakeSound() {
            Console.WriteLine(Name + "正在發出聲音。");
        }
    }

    class Program {
        static void Main() {
            // 創建動物物件
            Animal lion = new Animal("獅子");
            Animal bird = new Animal("鳥");

            // 呼叫 IMovable 和 ISound 介面的方法
            lion.Move();      // 輸出:獅子正在移動。
            lion.MakeSound(); // 輸出:獅子正在發出聲音。
            bird.Move();      // 輸出:鳥正在移動。
            bird.MakeSound(); // 輸出:鳥正在發出聲音。
        }
    }

程式實作練習:

  沒在leetcode中找到特別相關繼承的考題
  如果有看到也可以跟我說 我補充上來
  ==========
  以下我會以w3schools的Example範例來出題
  請朋友們可以跟我一起練習

  問題1(抽象類別):
    請使用抽象類別設計一個抽象類別Animal,
  該類別包含一個抽象方法 animalSound 和一個常規方法 sleep。
  然後,建立一個具體的類別(Pig)繼承自動物類別,實作 animalSound 方法,
  並創建一個物件並呼叫這兩個方法。

  欲執行程式如下:

    class Program
    {
      static void Main(string[] args)
      {
        // 創建一個 Pig 物件
        Pig myPig = new Pig();

        // 呼叫抽象方法 animalSound
        myPig.animalSound();  // 輸出:The pig says: wee wee

        // 呼叫常規方法 sleep
        myPig.sleep();  // 輸出:Zzz
      }
    }

  Example的答案:
  https://ithelp.ithome.com.tw/upload/images/20230920/20163217OlUDjAcebl.png

by w3schools C# abstract example

  問題2(介面):
    請使用介面(Interface)設計一個動物介面(IAnimal),
  該介面包含一個方法 animalSound(沒有方法實作)。
  然後,建立一個具體的類別(Pig)實作該介面,並呼叫介面方法。

  欲執行程式如下:

    class Program 
    {
        static void Main(string[] args) 
        {
            // 創建一個 Pig 物件
            Pig myPig = new Pig();

            // 呼叫介面方法 animalSound
            myPig.animalSound();  // 輸出:The pig says: wee wee
        }
    }

  Example的答案:
  https://ithelp.ithome.com.tw/upload/images/20230920/20163217U3BEYj80Kx.png

by w3schools cs_interface example

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C# abstract
  4. w3schools cs_interface

期望挑戰30天持續更新成功 ~ DAY7


上一篇
[DAY6] C#基礎與實作(繼承. 多型)
下一篇
[DAY8] C#基礎與實作(List)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言