多态
多态的概念
同一操作作用于不同的类的对象,不同的类的对象进行不同的执行,最后产生不同的执行结果。
多态的实现
C#中支持基于接口的多态和基于继承的多态,基于继承的多态设计在基类中定义方法,并在派生类中重写方法。
多态和重写是紧密联系的,重写是实现多态的重要手段。重写基类方法就是修改它的实现,或者说在派生类中对继承的基类方法重新编写。
在基类中用virtual关键字声明的方法(叫做虚拟方法)在派生类中可以重写。
// 语法
访问修饰符 virtual 返回类型 方法名()
{
// 方法体
}
示例:
class Father
{
...
public virtual void Display() // 基类中定义成虚拟方法,使用virtual关键字
{
// Father does sth.
...
}
}
class Son: Father
{
...
public override void Display() // 重写基类的Display方法
{
// Son does sth.
...
// 若想派生类方法执行后,继续执行基类方法,执行 base.Display() 方法
base.Display();
}
}
重写时,子类重写方法的访问级别和父类虚拟方法的访问级别必须相同。
方法重载、重写和隐蔽
在基类和派生类中可以存在同名方法,这些同名的方法可以分为重载、重写和隐藏3种类型。
- 重载
重载是在同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同,就是签名不同,签名由方法名和参数组成。
能通过传递不同的参数来决定到底调用哪一个同名方法。
注意返回值类型不同不能构成重载,因为签名不包括返回值。 - 重写
基类方法中使用virtual关键字声明的方法和派生类中使用override关键字声明的方法名称相同,参数列表也相同,就是基类方法和派生类方法的签名相同,实现了派生类重写基类中的同名方法。 - 隐藏
基类中的方法不声明为virtual(默认为非虚方法),在派生类中声明与基类同名时,需使用new关键字,以隐藏基类同名方法。
示例:
class Father
{
...
public virtual void Display() // 基类中定义成虚拟方法,使用virtual关键字
{
// Father does sth.
...
}
public void Display(int id)
{
// 若想执行无参方法
this.Display();
// 有参方法
Console.WriteLine("id: " + id);
}
}
class Son: Father
{
...
public override void Display() // 重写基类的Display方法
{
// do sth.
...
// 若想派生类方法执行后,继续执行基类方法,执行 base.Display() 方法
base.Display();
}
public new void Display(int no) // 使用new隐藏基类
{
// do sth.
...
// 若想派生类方法执行后,继续执行基类方法,执行 base.Display() 方法
base.Display();
// 隐藏基类自定义方法
Console.WriteLine("no: " + no);
}
}