1. 程式人生 > >abstract(C# 參考)

abstract(C# 參考)

abstract 修飾符指示所修飾的內容缺少實現或未完全實現。abstract 修飾符可用於類、方法、屬性、索引器和事件。在類宣告中使用abstract 修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。

在此例中,類 Square 必須提供 Area 的實現,因為它派生自 ShapesClass:

C#

 

abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int side = 0;

    public Square(int n)
    {
        side = n;
    }
    // Area method is required to avoid
    // a compile-time error.
    public override int Area()
    {
        return side * side;
    }

    static void Main() 
    {
        Square sq = new Square(12);
        Console.WriteLine("Area of the square = {0}", sq.Area());
    }

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

}
// Output: Area of the square = 144

抽象類具有以下特性:

  • 抽象類不能例項化。

  • 抽象類可以包含抽象方法和抽象訪問器。

  • 不能用 sealed(C# 參考) 修飾符修飾抽象類,因為這兩個修飾符的含義是相反的。採用 sealed 修飾符的類無法繼承,而abstract 修飾符要求對類進行繼承。

  • 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現。

在方法或屬性宣告中使用 abstract 修飾符以指示方法或屬性不包含實現。

抽象方法具有以下特性:

  • 抽象方法是隱式的虛方法。

  • 只允許在抽象類中使用抽象方法宣告。

  • 因為抽象方法宣告不提供實際的實現,所以沒有方法體;方法宣告只是以一個分號結束,並且在簽名後沒有大括號 ({ })。例如:

     

     

    public abstract void MyMethod();
    

    實現由一個重寫方法override(C# 參考)提供,此重寫方法是非抽象類的一個成員。

  • 在抽象方法宣告中使用 static 或 virtual 修飾符是錯誤的。

除了在宣告和呼叫語法上不同外,抽象屬性的行為與抽象方法一樣。

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

  • 在派生類中,通過包括使用 override 修飾符的屬性宣告,可以重寫抽象的繼承屬性。

有關抽象類的更多資訊,請參見抽象類、密封類及類成員(C# 程式設計指南)

抽象類必須為所有介面成員提供實現。

實現介面的抽象類可以將介面方法對映到抽象方法上。例如:

C#

 

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

在本例中,DerivedClass 類是從抽象類 BaseClass 派生的。抽象類包含一個抽象方法 AbstractMethod 和兩個抽象屬性 X 和 Y。

C#

 

abstract class BaseClass   // Abstract class
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // Abstract method
    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()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
    }
}
// Output: x = 111, y = 161

在上面的示例中,如果嘗試通過使用下面的語句將抽象類例項化:

 

 

BaseClass bc = new BaseClass();   // Error

將出現錯誤,指出編譯器無法建立抽象類“BaseClass”的例項。