C# 面向对象三大特性:封装、继承、多态

2019-12-30 11:57:40王冬梅

下面就举个例子来说明封装、继承、多态:

这个例子的基类,就是上面描述概念的时候提到的形状,形状是基类,而这个基类是个抽象的概念,而不是具体的,因此是抽象类,此类包含属性形状名称、输出形状周长和面积的方法以及计算形状周长和面积的抽象方法:


  /// <summary>
  /// 形状基类
  /// </summary>
  public abstract class Shape
  {
    /// <summary> 
    /// 形状名称
    /// </summary>
    public string ShapeName { get; private set; }

    public Shape(string shapeName)
    {
      ShapeName = shapeName;
    }

    /// <summary>
    /// 输出形状周长
    /// </summary>
    public virtual void PrintPerimeter(double perimeter)
    {
      Console.WriteLine(ShapeName + " Perimeter: " + perimeter);
    }

    /// <summary>
    /// 输出形状面积
    /// </summary>
    public virtual void PrintArea(double area)
    {
      Console.WriteLine(ShapeName + " Area: " + area);
    }

    /// <summary>
    /// 计算形状周长
    /// </summary>
    /// <returns></returns>
    public abstract double CalculatePerimeter();

    /// <summary>
    /// 计算形状面积
    /// </summary>
    /// <returns></returns>
    public abstract double CalculateArea();
  }

下面再来看具体的子类,子类是圆,包含属性半径、计算周长和面积的方法:


  /// <summary>
  /// 圆
  /// </summary>
  public class Circle : Shape
  {
    /// <summary>
    /// 圆的半径
    /// </summary>
    public double R { get; set; }

    public Circle()
      : base("Circle")
    {
      this.R = 0;
    }

    /// <summary>
    /// 圆的周长
    /// </summary>
    /// <returns></returns>
    public override double CalculatePerimeter()
    {
      return 2 * Math.PI * R;
    }

    /// <summary>
    /// 圆的面积
    /// </summary>
    /// <returns></returns>
    public override double CalculateArea()
    {
      return Math.PI * R * R;
    }
  }

再来看看长方形,包含属性高度和宽度、计算周长和面积的方法:


public class Rectangle : Shape
  {
    /// <summary>
    /// 长方形的长度
    /// </summary>
    public double Width { get; set; }

    /// <summary>
    /// 长方形的高度
    /// </summary>
    public double Height { get; set; }

    public Rectangle()
      : base("Rectangle")
    {
      Width = 0;
      Height = 0;
    }

    /// <summary>
    /// 长方形的周长
    /// </summary>
    /// <returns></returns>
    public override double CalculatePerimeter()
    {
      return (Width + Height) * 2;
    }

    /// <summary>
    /// 长方形的面积
    /// </summary>
    /// <returns></returns>
    public override double CalculateArea()
    {
      return Width * Height;
    }
  }