第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
類別同時實現了 IMovable
和 IMakeSound
介面,這表明狗可以移動並發出聲音。
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
類別既能繼承基礎行為,也能擴展功能,滿足不同的需求。
實作練習
- 建立介面與抽象類別
- 在
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."); } }
- 在
- 執行程式
- 使用以下指令來執行程式:
1
dotnet run
- 檢視輸出,確認
Dog
和Car
類別的Move
方法和Dog
類別的MakeSound
方法是否正確執行。
- 使用以下指令來執行程式:
教學重點
- 瞭解抽象類別和介面的概念及用途。
- 使用抽象類別來定義基本屬性和行為。
- 使用介面來擴展功能並實現多重行為。
- 理解在不同情境中選擇抽象類別或介面的依據。
下一節中,我們將學習如何在 C# 中使用 例外處理(Exception Handling)來處理程式執行過程中的錯誤。
本文章以 CC BY 4.0 授權