abstract (C# 參考)

abstract 修飾詞表示要修改的項目具有遺失或不完整的實作。 抽象修飾詞可以與類別、方法、屬性、索引子和事件搭配使用。 在類別宣告中使用 abstract 修飾詞,來表示某一類別只是要作為其他類別的基底類別,不是自行具現化。 標記為抽象的成員,必須由衍生自抽象類別的非抽象類別實作。

範例 1

在此範例中,Square 類別必須提供 GetArea 的實作,因為它繼承自 Shape

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    private int _side;

    public Square(int n) => _side = n;

    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => _side * _side;

    static void Main()
    {
        var sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
    }
}
// Output: Area of the square = 144

抽象類別具有下列功能:

  • 抽象類別無法具現化。

  • 抽象類別可能包含抽象方法和存取子。

  • 因為兩個修飾詞的意義相反,所以無法使用 sealed 修飾詞來修改抽象類別。 sealed 修飾詞可防止繼承類別,而 abstract 修飾詞需要繼承類別。

  • 衍生自抽象類別的非抽象類別必須包括所有繼承抽象方法和存取子的實際實作。

在方法或屬性宣告中使用 abstract 修飾詞,表示方法或屬性未包含實作。

抽象方法具有下列功能:

  • 抽象方法隱含為虛擬方法。

  • 只有在抽象類別中才允許抽象方法宣告。

  • 因為抽象方法宣告未提供實際實作,所以沒有方法主體;方法宣告的結尾就是分號,而且簽章後面沒有大括號 ({ })。 例如:

    public abstract void MyMethod();  
    

    方法 override 提供了實作,而這個方法是非抽象類別的成員。

  • 在抽象方法宣告中使用 staticvirtual 修飾詞是錯誤的。

抽象屬性的行為類似抽象方法,但宣告和引動過程語法的差異除外。

  • 在靜態屬性上使用 abstract 修飾詞是錯誤的。

  • 包括使用 override 修飾詞的屬性宣告,即可覆寫衍生類別中的抽象繼承屬性。

如需抽象類別的詳細資訊,請參閱抽象和密封類別以及類別成員

抽象類別必須提供所有介面成員的實作。

實作介面的抽象類別可能會將介面方法對應至抽象方法。 例如:

interface I
{
    void M();
}

abstract class C : I
{
    public abstract void M();
}

範例 2

在此範例中,DerivedClass 類別衍生自抽象類別 BaseClass。 抽象類別包含抽象方法 AbstractMethod 和兩個抽象屬性:XY

// Abstract class
abstract class BaseClass
{
    protected int _x = 100;
    protected int _y = 150;

    // Abstract method
    public abstract void AbstractMethod();

    // Abstract properties
    public abstract int X { get; }
    public abstract int Y { get; }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        _x++;
        _y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return _x + 10;
        }
    }

    public override int Y   // overriding property
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        var o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine($"x = {o.X}, y = {o.Y}");
    }
}
// Output: x = 111, y = 161

在上述範例中,如果您嘗試使用如下的陳述式來具現化抽象類別︰

BaseClass bc = new BaseClass();   // Error  

您會收到錯誤,指出編譯器無法建立抽象類別 'BaseClass' 的執行個體。

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。

另請參閱