文章

第10天:介面與抽象類別

課程簡介

今天,我們將探討 介面(Interface)和 抽象類別(Abstract Class)這兩個概念,並了解它們的異同和應用。介面和抽象類別都可以用來定義一組需要實現的行為,讓不同的類別可以共享某些功能。但它們在使用方式和設計意圖上有不同之處。


學習目標

  • 瞭解抽象類別的概念與用途
  • 瞭解介面的概念與用途
  • 理解介面與抽象類別的異同
  • 學習如何使用介面和抽象類別來進行程式設計

課程內容

1. 抽象類別(Abstract Class)

抽象類別是一種不能被直接實例化的類別,只能被繼承。它可包含抽象方法和具體方法,目的是為子類別提供一個共同的基礎。抽象類別通常用於描述「是什麼」(What it is),適合用在有一定共同行為的類別中。

抽象類別的特點

  • 只能被繼承,不能實例化。
  • 可以包含抽象方法(沒有實作)和具體方法(有實作)。
  • 抽象方法必須由子類別覆寫。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public abstract class Animal
{
    public string Name;

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

    // 抽象方法,沒有實作
    public abstract void MakeSound();

    // 具體方法,有實作
    public void Eat()
    {
        Console.WriteLine(Name + " is eating.");
    }
}

public class Dog : Animal
{
    public Dog(string name) : base(name)
    {
    }

    // 覆寫抽象方法
    public override void MakeSound()
    {
        Console.WriteLine(Name + " barks.");
    }
}

2. 介面(Interface)

介面是一組沒有實作的方法聲明,專門用來定義行為或功能,讓不同類別可以實現這些行為。介面通常描述「能做什麼」(What it can do),適合用在多種類別可以共同執行的動作上。介面支援多重實作,這意味著一個類別可以同時實現多個介面。

介面的特點

  • 不包含具體實作,所有方法都是抽象的。
  • 支援多重實作,類別可以實現多個介面。
  • 介面中定義的所有方法都是 public

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public interface IMovable
{
    void Move();
}

public interface IMakeSound
{
    void MakeSound();
}

public class Car : IMovable
{
    public void Move()
    {
        Console.WriteLine("The car is moving.");
    }
}

public class Dog : IMovable, IMakeSound
{
    public void Move()
    {
        Console.WriteLine("The dog is running.");
    }

    public void MakeSound()
    {
        Console.WriteLine("The dog barks.");
    }
}

在這裡,Dog 類別同時實現了 IMovableIMakeSound 介面,這表明狗可以移動並發出聲音。


3. 介面與抽象類別的異同

異同點比較表

特性抽象類別介面
繼承只能單一繼承可以多重實作
實作可以包含具體實作不能包含具體實作
成員可以有字段、屬性、方法等只可以有方法(C# 8.0 起可以包含屬性)
設計意圖描述「是什麼」描述「能做什麼」
存取修飾可以有各種存取修飾所有成員皆為 public

使用指導

  • 選擇抽象類別:當您有相似的一組類別,需要共享一些具體的屬性或方法時,可以使用抽象類別作為基類。
  • 選擇介面:當您需要定義一些動作,且希望多個不同類別都能實現這些動作時,應使用介面。

4. 抽象類別與介面結合使用

在實際應用中,通常可以結合使用抽象類別和介面,讓程式更加靈活。例如,一個類別可以從抽象類別繼承基本屬性和方法,同時實現多個介面來達成其他功能。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public abstract class Animal
{
    public string Name;

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

    public abstract void MakeSound();
}

public interface IMovable
{
    void Move();
}

public class Bird : Animal, IMovable
{
    public Bird(string name) : base(name)
    {
    }

    public override void MakeSound()
    {
        Console.WriteLine(Name + " chirps.");
    }

    public void Move()
    {
        Console.WriteLine(Name + " flies.");
    }
}

在此範例中,Bird 類別繼承了 Animal 抽象類別,並實現了 IMovable 介面。這樣一來,Bird 類別既能繼承基礎行為,也能擴展功能,滿足不同的需求。


實作練習

  1. 建立介面與抽象類別
    • Program.cs 中加入以下程式碼:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      
      using System;
      
      class Program
      {
          static void Main(string[] args)
          {
              Dog myDog = new Dog("Buddy");
              myDog.MakeSound();
              myDog.Move();
      
              Car myCar = new Car();
              myCar.Move();
          }
      }
      
      public abstract class Animal
      {
          public string Name;
      
          public Animal(string name)
          {
              Name = name;
          }
      
          public abstract void MakeSound();
      }
      
      public interface IMovable
      {
          void Move();
      }
      
      public class Dog : Animal, IMovable
      {
          public Dog(string name) : base(name)
          {
          }
      
          public override void MakeSound()
          {
              Console.WriteLine(Name + " barks.");
          }
      
          public void Move()
          {
              Console.WriteLine(Name + " is running.");
          }
      }
      
      public class Car : IMovable
      {
          public void Move()
          {
              Console.WriteLine("The car is driving.");
          }
      }
      
  2. 執行程式
    • 使用以下指令來執行程式:
      1
      
      dotnet run
      
    • 檢視輸出,確認 DogCar 類別的 Move 方法和 Dog 類別的 MakeSound 方法是否正確執行。

教學重點

  • 瞭解抽象類別和介面的概念及用途。
  • 使用抽象類別來定義基本屬性和行為。
  • 使用介面來擴展功能並實現多重行為。
  • 理解在不同情境中選擇抽象類別或介面的依據。

下一節中,我們將學習如何在 C# 中使用 例外處理(Exception Handling)來處理程式執行過程中的錯誤。

本文章以 CC BY 4.0 授權