多态 C#
关注我,为您分享C#技术实现
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
多态性通过派生类(子类)覆写基类中的虚函数型方法来实现
C#支持两种多态性:
- 编译时---重载(overload)
- 运行时---虚方法和重写(override)
虚成员和重写
- 指在基类中申明了方法、属性、索引器或事件,也做了一个最简单的处理。
- 使用virtual关键字将成员申明为虚成员
代码示例:
/// <summary>
/// 面积(基类)
/// </summary>
public class Dimensions
{
public const double PI = Math.PI;//圆周率,常量
protected double x, y;//分别代表长、宽
public Dimensions()
{
//空的构造函数
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
//计算面积,虚方法,等待被重写
return x * y;
}
}
public class Circle : Dimensions
{
//圆
public Circle(double r)//这个构造函数的目的就是去实例化基类,可以做一些事情的
: base(r, 0)
{
}
/// <summary>
/// 重写基类的计算面积的方法
/// </summary>
/// <returns></returns>
public override double Area()
{
return PI * x * x;
}
}
/// <summary>
/// 球体
/// </summary>
public class Sphere:Dimensions
{
public Sphere(double r)
:base(r,0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
/// <summary>
/// 圆柱体
/// </summary>
public class Cylinder: Dimensions
{
public Cylinder(double r,double h)
:base(r,h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
运行结果:
虚方法规则:
- 默认情况下,方法是非虚拟的。不能重写非虚方法。
- Virtual修饰符不能与static、abstract、private或override修饰符一起使用。
- 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
- 在静态属性上使用virtual修饰符是错误的。
- 通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。
隐藏基类方法:
- 若要隐藏继承的成员,则使用new修饰符修饰该成员
/// 面积(基类)
/// </summary>
public class Dimensions
{
public const double PI = Math.PI;//圆周率,常量
protected double x, y;//分别代表长、宽
public void Info()
{
//方法体
}
}
public class Circle : Dimensions
{
public new void Info()
{
////方法体
}
}