实现多态的方法二 ——抽象类

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);

原文地址:https://www.cnblogs.com/apollo-shen/p/6796535.html