【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,包含 Python 為主的課程主題,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。

抽象子類別

如果一個繼承抽象類別的衍生類別,本身又包含了抽象成員,則這個類別還是必須以 abstract 關鍵字進行修飾,它本身依然是一個不折不扣的抽象類別,也因此無法被用來建立實體物件。



上圖包含了三個類別,其中的類別 A 為一抽象類別,而類別 B 雖然繼承了類別 A ,但是由於其中另外定義了一個抽象成員 bMethod ,因此這個類別依然是一個抽象類別,類別 C 繼承了類別 B ,覆寫其中的抽象成員 bMethod ,成為一個實體類別,這三個類別當中,只有類別 C 可以用來建立實體物件。

接下來以「抽象類別」這一篇的抽象類別範例為基礎,建立一個衍生的抽象類別 Square ,最後建立一個衍生自此類別的實體類別 SquareV 

abstract class TemplateClass
{
    public double l = 0;
    public TemplateClass(string shape, double r)
    {
        this.TheShape(shape);
        this.l = r;
    }
    private void TheShape(string shape)
    {
        Console.WriteLine("目前測量的形狀為{0} ", shape);
    }
    abstract protected void Length(double l);
    abstract protected void Area(double l);
}
abstract class Square : TemplateClass
{
    public Square(string shape, double l)
        : base(shape, l)
    { }
    protected override void Length(double l)
    {
        double squareLength;
        squareLength = 4 * l;
        Console.WriteLine
            ("邊長為{0} 的正方形周長= {1} ", l, squareLength);
    }
    protected override void Area(double l)
    {
        double area;
        area = Math.Pow(l, 2);
        Console.WriteLine
            ("邊長為{0} 的正方形面積= {1} ", l, area);
    }
    public void GetResult()
    {
        Length(l);
        Area(l);
        Volume(l);
    }
    abstract protected void Volume(double l);
}
class SquareV : Square
{
    public SquareV(string shape, double l)
        : base(shape, l)
    { }
    protected override void Volume(double l)
    {
        double volume;
        volume = Math.Pow(l, 3);
        Console.WriteLine
            ("邊長為{0} 的立方體體積= {1} ", l, volume);
    }
}

抽象類別 TemplateClass 只定義了兩個抽象的方法成員, Length 與 Area ,而子類別 Square 繼承 TemplateClass ,除了實作其抽象成員,同時又定義了一個抽象方法 Volume ,因此這個類別同樣為抽象類別以 abstract 宣告。

接下來宣告的類別 SquareV 繼承 Square ,並且實作其中的 Volume 成員,由於它本身並沒有進一步定義自已的抽象類別,因此為實體類別。

class Program
{
    static void Main(string[] args)
    {
        const double l = 10;
        SquareV square = new SquareV("正方形", l);
        square.GetResult();
        Console.ReadLine();
    }
}

回到主程式 main ,建立類別 SquareV 的實體物件,然後執行其方法 GetResult。

目前測量的形狀為正方形
邊長為10 的正方形周長= 40
邊長為10 的正方形面積= 100
邊長為10 的立方體體積= 1000

如果嘗試建立 Square 物件,如下式:

Square s = new Square();

由於其為一抽象類別,此時會出現以下的錯誤訊息:

錯誤 1 無法建立抽象類別或介面 'AbstractClassd.Square' 的執行個體 …




沒有留言: