zoukankan      html  css  js  c++  java
  • 实现多态的方法二 ——抽象类

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

  • 相关阅读:
    Python文件的两种用途
    模块的搜索路径
    循环导入问题
    import和from...import
    模块的四种形式
    函数小结
    面向过程编程
    内置函数
    匿名函数
    递归
  • 原文地址:https://www.cnblogs.com/apollo-shen/p/6796535.html
Copyright © 2011-2022 走看看