抽象类和密封类
在定义类时可以使用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:Shape21 {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:Shape36 {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