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

上圖包含了三個類別,其中的類別 A 為一抽象類別,而類別 B 雖然繼承了類別 A ,但是由於其中另外定義了一個抽象成員 bMethod ,因此這個類別依然是一個抽象類別,類別 C 繼承了類別 B ,覆寫其中的抽象成員 bMethod ,成為一個實體類別,這三個類別當中,只有類別 C 可以用來建立實體物件。
接下來以「抽象類別」這一篇的抽象類別範例為基礎,建立一個衍生的抽象類別 Square ,最後建立一個衍生自此類別的實體類別 SquareV 。
抽象類別 TemplateClass 只定義了兩個抽象的方法成員, Length 與 Area ,而子類別 Square 繼承 TemplateClass ,除了實作其抽象成員,同時又定義了一個抽象方法 Volume ,因此這個類別同樣為抽象類別以 abstract 宣告。
接下來宣告的類別 SquareV 繼承 Square ,並且實作其中的 Volume 成員,由於它本身並沒有進一步定義自已的抽象類別,因此為實體類別。
回到主程式 main ,建立類別 SquareV 的實體物件,然後執行其方法 GetResult。
如果嘗試建立 Square 物件,如下式:
由於其為一抽象類別,此時會出現以下的錯誤訊息:

上圖包含了三個類別,其中的類別 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' 的執行個體 …
沒有留言:
張貼留言