多态
多态的概念
同一操作作用于不同的类的对象,不同的类的对象进行不同的执行,最后产生不同的执行结果。
多态的实现
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);}}
- 点赞
- 收藏
- 分享
- 文章举报
Yeats.NeverGiveUp发布了12 篇原创文章 · 获赞 0 · 访问量 164私信关注