程式碼示範
using System;
abstract class Shape {
// 唯讀抽象屬性:衍生類別必須實作 get
public abstract int Area { get; }
}
class Rectangle : Shape {
private int FWidth, FHeight;
public Rectangle(int w, int h) { FWidth = w; FHeight = h; }
public override int Area {
get { return FWidth * FHeight; }
}
}
class Program {
static void Main() {
Rectangle rect = new Rectangle(20, 10);
Console.WriteLine(rect.Area); // 200
Console.ReadKey();
}
}
抽象屬性語法規則
- 宣告於
abstract class 中,標記 abstract
- 可指定
get、set 或兩者皆有,決定衍生類別必須實作的存取器
- 衍生類別用
override 實作,不可加 virtual(除非再衍生)
- 抽象屬性本身不包含邏輯,純粹定義契約
進階變體
讀寫抽象屬性
abstract class Entity {
public abstract string Name { get; set; }
}
class User : Entity {
private string _name;
public override string Name {
get => _name;
set => _name = value?.Trim() ?? throw new ArgumentNullException();
}
}
搭配介面使用
interface IMeasurable {
double Area { get; }
}
abstract class Shape : IMeasurable {
public abstract double Area { get; } // 同時滿足介面與抽象類別契約
}
實務應用場景
- 領域模型驗證:在
set 中集中驗證邏輯(如長度、格式、業務規則)。
- 計算屬性:
Area、Perimeter 等衍生數值,唯讀抽象屬性強制各形狀自行實作演算法。
- 策略模式基礎:抽象屬性回傳策略物件,衍生類別決定具體策略。
注意事項
- 抽象屬性不能有
private 存取修飾詞(預設 public)
- 靜態屬性不能是抽象的
- 介面中的屬性隱含抽象,不需加
abstract