介面可繼承一或多個基底介面,形成契約層級的組合:
interface IA { }
interface IB : IA { }
interface IC : IA, IB { }
interface ID : IA, IB, IC { }
實作 ID 的類別必須同時滿足 IA、IB、IC、ID 的所有成員。
public,不可加存取修飾詞| 相同點 | 不同點 |
|---|---|
| 不可實例化 | 介面無實作細節;抽象類別可有實作 |
| 含未實作成員 | 介面所有成員皆為契約;抽象類別可混合 |
| 衍生類必須實作 | 介面支援多實作;類別單一繼承 |
介面是實作「回呼」的標準方式:將具體行為封裝於實作介面的物件,由控制器在特定時機呼叫。
// 1. 定義回呼契約
public interface IPlayer
{
void Play();
}
// 2. 具體回呼實作
public class PlayBasketball : IPlayer
{
public void Play() => Console.WriteLine("玩籃球");
}
public class PlayFootball : IPlayer
{
public void Play() => Console.WriteLine("玩足球");
}
// 3. 控制器:持有介面參考,決定何時觸發
public class Resolve
{
private readonly IPlayer _player;
public Resolve(IPlayer player) => _player = player;
public void Play() => _player.Play();
}
// 4. 使用
var resolve = new Resolve(new PlayBasketball());
resolve.Play(); // 輸出:玩籃球
resolve = new Resolve(new PlayFootball());
resolve.Play(); // 輸出:玩足球