多态的本质:一个接口 不同实现 即多个功能
类别:静多态 动多态
一、静多态
函数的响应是在编译时发生的 主要包括函数重载和运算符重载两种
函数重载(overload) 同一作用域 方法名相同 参数列表必须不同 返回值类型可以不相同 其中参数列表不同包括参数类型不同或者参数个数不同
运算符会出新博客具体讲
二、动多态
函数的响应是在运行时发生的 动多态是由抽象类和虚方法实现 代码如下:
class ShApe
{
protected int length;
protected int width;
public ShApe(int a = 0, int b = 0)
{
length = a;
width = b;
}
public virtual int area()
{
Console.WriteLine("父类的面积:");
return 0;
}
}
class Bbox:ShApe
{
public Bbox(int a = 0, int b = 0) : base(a, b) { }
public override int area()
{
Console.WriteLine("Bbox类的面积:");
return length * width;
}
}
class box: ShApe
{
public box(int a = 0, int b = 0) : base(a, b) { }
public override int area()
{
Console.WriteLine("box类的面积:");
return length * width / 2;
}
}
class caller
{
public void CallArea(ShApe sh)
{
int a;
a = sh.area();
Console.WriteLine("面积:{0}",a);
}
}
class integrated
{
static void Main(string[] args)
{
caller ca = new caller();
Bbox bb = new Bbox(10, 20);
box b = new box(100, 300);
//编译时ca对应调用callArea 运行期间检测到bb b 分别是Bbox box 则对应调用
ca.CallArea(bb);
ca.CallArea(b);
}
}
重写(override) 子类中为满足自己的需求来重复定义某个方法的不同实现 需要使用override关键字
* 被重写的方法必须是虚方法 用的是virtual
* 相同的方法名 相同的参数列表 相同的返回值
覆盖(new) 指的是不同类(基类与派生类)有两个或多个返回类型、方法名、参数都相同 但是方法体不同的方法 这只是表面的覆盖 所以也叫隐藏 被覆盖的父类方法是可以被调用的 作用域问题
重载必然发生在一个类中 函数名相同 参数类型或顺序不同构成重载 与返回类型无关
重写必然发生在基类和派生类中 基类函数用virtual修饰 派生类用override修饰
覆盖 在子类中写一个和基类一样名字(参数不同也算)的非虚函数 会让基类中的函数被隐藏 编译后会提示要求使用new关键字
override重写特性
* 由override声明重写的方法称为重写基方法 重写的基方法必须与override方法具有相同的签名
* 重写的基方法必须是virtual abstract override的 不能重写非虚方法 静态方法
* override方法与virtual的方法必须有相同的访问级别修饰符 不能更改virtual方法的可访问性
* 不能使用new static virtual来修改override方法
* 重写属性声明必须指定与继承属性完全相同的访问修饰符 类型 名称 并且被重写的属性是virtual abstract override的
三、抽象类
使用abstract创建抽象类 用于提供接口的部分类的实现
* 当一个派生类继承自该抽象类时 实现即完成
* 抽象类包括 抽象方法 抽象方法可被派生类实现
有关抽象类的规则
* 1.不能创建一个抽象类的实例
* 2.不能在一个抽象类外部声明一个抽象方法
* 3.通过在类定义前面放置关键字sealed 可以将类声明为密封类 当一个类被sealed时 它不能被继承
* 4.由3可知抽象类不能被声明为sealed
一个简单的抽象类的代码示例:
//抽象类
abstract class Shape
{
abstract public int area();
}
class Box : Shape
{
private int length;
private int width;
public Box(int x = 0,int y = 0)
{
length = x;
width = y;
}
public override int area()
{
Console.WriteLine("Box的面积:");
return length * width;
}
}
class integrated
{
static void Main(string[] args)
{
Box b = new Box(10, 20);
int a = b.area();
Console.WriteLine(a);
}
}