abstract 修飾詞用於宣告抽象成員,強制衍生類別提供具體實作。可套用於類別、方法、屬性、事件、索引子,但不可與 static、virtual 同時使用。本文透過完整範例展示各類抽象成員的定義與實作模式。
abstract。override 實作所有繼承的抽象成員(除非衍生類別本身也是抽象類別)。using System;
namespace AbstractDemo
{
// 抽象基類
public abstract class BaseClass
{
// 抽象屬性:同時有 get/set 表示衍生類必須實作為可讀寫
public abstract string Attribute { get; set; }
// 抽象方法
public abstract void Function(string value);
// 抽象事件
public abstract event EventHandler Event;
// 抽象索引子:僅有 get 表示衍生類必須實作為唯讀
public abstract char this[int index] { get; }
}
// 具體衍生類
public class DeriveClass : BaseClass
{
private string attribute;
// 實作抽象屬性
public override string Attribute
{
get { return attribute; }
set { attribute = value; }
}
// 實作抽象方法
public override void Function(string value)
{
attribute = value;
if (Event != null) Event(this, EventArgs.Empty); // 觸發事件
}
// 實作抽象事件
public override event EventHandler Event;
// 實作抽象索引子
public override char this[int index]
{
get { return attribute[index]; }
}
}
// 測試程式
class Program
{
static void OnFunction(object sender, EventArgs e)
{
DeriveClass obj = (DeriveClass)sender;
for (int i = 0; i < obj.Attribute.Length; i++)
Console.WriteLine(obj[i]); // 使用索引子
}
static void Main()
{
DeriveClass obj = new DeriveClass();
obj.Attribute = "1234567";
Console.WriteLine(obj.Attribute); // 輸出 1234567
obj.Event += new EventHandler(OnFunction);
obj.Function("7654321"); // 觸發事件,輸出 7 6 5 4 3 2 1
Console.ReadLine();
}
}
}
1234567
7
6
5
4
3
2
1
| 成員類型 | 宣告語法 | 衍生類實作重點 |
|---|---|---|
| 方法 | public abstract void Method(T param); | 以 override 提供方法主體 |
| 屬性 | public abstract T Prop { get; set; } | 若僅 get 則衍生類實作為唯讀;get; set; 則須雙向實作 |
| 事件 | public abstract event EventHandler Event; | 衍生類以 public override event EventHandler Event; 宣告 |
| 索引子 | public abstract T this[int i] { get; set; } | 同屬性,存取子決定讀寫權限 |
interface)亦可定義契約,但無法提供任何實作;抽象類別允許部分實作與狀態欄位。善用 abstract 強制實作契約,配合 override 明確表達覆寫意圖,是建立可擴充、可維護類別階層的基石。