抽象類和密封類
在定義類時可以使用abstract關鍵字聲明這個類是抽象的。抽象類不能被實例化,即不能創建抽象類的實例。抽象類的主要作用是充當其他類的基類。
密封類的概念剛好與抽象類相對,這種類不能充當別的類的基類。“密封”的概念是不可以從這個類派生出別的類。在定義類時用sealed關鍵字指明類是密封的。
下面聲明兩個類,一個抽象類,一個密封類。
1 public abstract class Shape //抽象類 2 { 3 //// 4 } 5 6 public sealed class Rectangle:Shape //密封類 7 { 8 9 }
如果違反抽象類和密封類的規定,試圖創建一個抽象類的實例或是試圖從一個密封類派生出另外一個類,都會受到一個編譯錯誤。
抽象類中可以包含一種特殊的方法即抽象方法。抽象方法只有方法簽名,沒有方法體。聲明抽象方法的語法如下:
訪問修飾符 abstract 返回值類型 方法名(參數列表);
抽象方法只能包含在抽象類中,而且派生類必須重寫父類中的抽象方法。抽象方法不能不含方法體,甚至不能包含大括號{},必須在參數列表後面直接跟分號。
1 public abstract class Shape 2 { 3 public abstract double calculateArea(); 4 } 5 6 public sealed class Triangle:Shape 7 { 8 private double edge, high; 9 public Triangle(double e, double h) 10 { 11 edge = e; 12 high = h; 13 } 14 15 public override double calculateArea() 16 { 17 return edge * high / 2; 18 } 19 } 20 public sealed class Rectangle:Shape 21 { 22 private double length, width; 23 public Rectangle(double l, double w) 24 { 25 length = l; 26 width = w; 27 } 28 29 public override double calculateArea() 30 { 31 return length * width; 32 } 33 } 34 35 public sealed class Circle:Shape 36 { 37 private double radius; 38 public Circle(double r) 39 { 40 radius = r; 41 } 42 43 public override double calculateArea() 44 { 45 return Math.PI * radius * radius; 46 } 47 } 48 49 static void Main(string[] args) 50 { 51 Shape s; 52 53 s = new Triangle(10, 15); 54 printArea(s); 55 s = new Rectangle(10, 15); 56 printArea(s); 57 s = new Circle(10); 58 printArea(s); 59 60 Console.ReadLine(); 61 } 62 63 static void printArea(Shape s) 64 { 65 Console.WriteLine("這個圖形是: " + s.GetType().ToString()); 66 Console.WriteLine("這個圖形的面積是: " + s.calculateArea().ToString()); 67 } 68 }
運行結果
這個圖形是: ShapeExample.Triangle 這個圖形的面積是: 75 這個圖形是: ShapeExample.Rectangle 這個圖形的面積是: 150 這個圖形是: ShapeExample.Circle 這個圖形的面積是: 314.159265358979