实现多态的方法二 ——抽象类
1、何种情况下需要用到抽象类?
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
2、如何实现抽象类
使用关键字 abstract将父类标记为抽象类 。
使用关键字 abstract,将父类的方法标记为抽象方法 (抽象方法不允许有方法体,即没有大括号,有大括号但是没有内容叫空实现)。
注意:抽象类中可以写抽象成员也可以写非抽象成员。非抽象类中不能有抽象成员,因为抽象的不能被实例化。
3、示例说明
1 /// <summary>
2 /// 声明一个抽象类Sharp作为父类
3 /// </summary>
4 public abstract class Sharp
5 {
6 public abstract double GetArea(); //声明抽象的方法,子类对其进行继承并重写
7 public abstract double Perimeter();
8 }
从上面可以看出抽象类的的抽象方法,没有方法体。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写。(也可以通俗理解为抽象方法的存在意义)。
1 /// <summary>
2 /// 声明一个继承于Sharp的子类Circle
3 /// </summary>
4 public class Circle : Sharp
5 {
6 private double r;
7 public double R
8 {
9 get { return r; }
10 set { r = value; }
11 }
12 public Circle(double r) //构造函数,初始化对象时对其进行赋值
13 {
14 this.R = r;
15 }
16 public override double GetArea()
17 {
18 return Math.PI*this.R*this.R;
19 }
20
21 public override double Perimeter()
22 {
23 return 2*Math.PI*this.R;
24 }
25 }
26 /// <summary>
27 /// 声明一个继承于Sharp的子类Square
28 /// </summary>
29 public class Square : Sharp
30 {
31 private double length;
32 public double Length
33 {
34 get { return length; }
35 set { length = value; }
36 }
37 private double weith;
38 public double Weith
39 {
40 get { return weith; }
41 set { weith = value; }
42 }
43 public Square(double length,double weith)
44 {
45 this.Length=length;
46 this.Weith=weith;
47 }
48 //构造函数必须与类名相同,构造函数为了帮助初始化对象(给对象的每个属性赋值)
49 public override double GetArea()
50 {
51 return this.Length * this.Weith;
52 }
53 public override double Perimeter()
54 {
55 return 2 * (this.Length + this.Weith);
56 }
57 }
任何子类必须重写抽象方法,除非子类本身也是抽象类,将子类的方法标记为重写方法,使用关键字override。
将光标移到 public class Square : Sharp的尾部,按下Shift+Alt+F10可以自动实现抽象类中的抽象方法。
1 namespace 求面积周长
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 //利用多态来求圆、长方体的面积与周长
8 Sharp sharp = new Square(5.2,3.5);//声明父类类型去指定子类对象Circle(3.2),
9 double L = sharp.Perimeter();
10 double A = sharp.GetArea();
11 Console.WriteLine(L);
12 Console.WriteLine(A);
13 Console.ReadKey();
14 }
Sharp sharp = new Square(5.2,3.5);抽象类的不能被实例化。
只需改变实例对象就可以实现圆的面积和周长的求解Sharp sharp = new Circle(3.2);