介面是「面向介面程式設計」核心,定義契約而非實作。本文系統說明介面語法、屬性/事件定義、多重繼承、與抽象類別比較、回呼模式實戰。
///
/// 玩遊戲介面
///
public interface IPlayer
{
/// 取得玩家名稱
string GetName();
/// 由 Player 決定出什麼手勢
string Show();
}
介面中屬性只有 get; set; 存取子,無實作主體。
/// 定義介面,包含 Name 屬性
public interface IAttribute
{
string Name { get; set; }
}
/// 實作介面屬性
public class Component : IAttribute
{
public string Name
{
get { return "張三"; }
set { this.Name = value; }
}
}
public class Options
{
public static readonly string JIANDAO = "剪刀";
public static readonly string SHITOU = "石頭";
public static readonly string BU = "布";
}
亦可用列舉或結構封裝固定狀態,參考《C# 程式設計利器之二:結構與列舉》。
public class Grandpa : IPlayer
{
public string GetName() { return "爺爺"; }
public string Show()
{
Random random = new Random();
int i = (int)(random.Next() * 1000) % 3;
switch (i)
{
case 0: return Options.JIANDAO;
case 1: return Options.SHITOU;
default: return Options.BU;
}
}
}
public class Grandson : IPlayer
{
public string GetName() { return "孫子"; }
public string Show() { return Options.JIANDAO; }
}

interface IA { }
interface IB : IA { }
interface IC : IA, IB { }
interface ID : IA, IB, IC { }
一個介面可繼承多個基底介面;實作類別需實作所有成員。
public,不可加存取修飾詞。| 特性 | 介面 | 抽象類別 |
|---|---|---|
| 可否實例化 | 否 | 否 |
| 未實作成員 | 所有成員 | 抽象方法 |
| 派生類責任 | 實作所有成員 | 實作抽象方法 |
| 多重繼承 | 支援 | 單一繼承 |
| 預設實作 | C# 8.0+ default 方法 | 可有虛擬/非虛擬方法 |
場景:延遲調用物件方法,於特定條件滿足時觸發。
using System;
using System.Collections.Generic;
using System.Text;
namespace CallBack
{
class Program
{
static void Main(string[] args)
{
// 建立控制器,注入回呼物件
Resolve resolve = new Resolve(new PlayBasketball());
resolve.Play();
resolve = new Resolve(new PlayFootball());
resolve.Play();
}
}
// 回呼介面
public interface IPlayer
{
void Play();
}
// 具體回呼:籃球
public class PlayBasketball : IPlayer
{
public void Play() { Console.WriteLine("玩籃球"); }
}
// 具體回呼:足球
public class PlayFootball : IPlayer
{
public void Play() { Console.WriteLine("玩足球"); }
}
// 控制器:持有介面參考
public class Resolve
{
private IPlayer player;
public Resolve(IPlayer player) { this.player = player; }
public void Play() { player.Play(); }
}
}