Warning: Undefined array key 0 in /www/wwwroot/w/show/success.php on line 266
Warning: Trying to access array offset on value of type null in /www/wwwroot/w/show/success.php on line 266
Warning: Undefined array key 0 in /www/wwwroot/w/show/success.php on line 266
Warning: Trying to access array offset on value of type null in /www/wwwroot/w/show/success.php on line 266
10.2.2 多态的实现
C#中支持基于接口的多态和基于继承的多态,基于继承的多态设计在基类中定义方法,并在派生类中重写方法。多态和重写是紧密联系的,重写是实现多态的重要手段。重写基类方法就是修改它的实现,或者说在派生类中对继承的基类方法重新编写。在基类中用virtual关键字声明的方法(叫做虚拟方法)在派生类中可以重写,虚拟方法语法如下。
访问修饰符 virtual 返回类型 方法名()
{
//方法体
}
在派生类中使用override关键字来声明重写,以实现对基类中的虚拟方法修改或重新编写。如在【范例10-1】的Person类中声明了一个Display方法用于显示姓名、年龄和性别等信息。代码如下。
01 public void Display()
02 {
03 Console.WriteLine("{0}是{1}性,年龄为{2}", this._name, this._gender, this._age);
04 }
Person的派生类Student和Teacher调用Display时都会显示与姓名、年龄和性别类似的信息,要想使显示学生的信息和显示的教师不一样,就需要使用virtual关键字把基类中的Display方法定义成虚拟方法,使用override关键字在派生类中重写Display方法。代码如下。
01 public virtual void Display() //基类Person中定义成虚拟方法,使用virtual关键字
02 {
03 Console.WriteLine("{0}是{1}性,年龄为{2}", this._name, this._gender, this._age);
04 }
在派生类Student中重写基类中的虚拟方法,使用override关键字,代码如下。
01 public override void Display() //重写基类中的Display方法
02 {
03 Console.WriteLine("这是一个学生:"); //在派生类中编写新代码
04 base.Display(); //调用基类的Display方法显示
05 }
在派生类Teacher中重写基类中的虚拟方法,使用override关键字,代码如下。
01 public override void Display() //重写基类中的Display方法
02 {
03 Console.WriteLine("这是一个老师:"); //在派生类中编写新代码
04 base.Display(); //调用基类的Display方法显示
05 }
**技巧** 重写时,子类重写方法的访问级别和父类虚拟方法的访问级别必须相同。如上例父类方法是public(public virtual void Display()),子类也必须是public级别。
Warning: Undefined array key 0 in /www/wwwroot/w/show/success.php on line 276
Warning: Trying to access array offset on value of type null in /www/wwwroot/w/show/success.php on line 276
Warning: Undefined array key 0 in /www/wwwroot/w/show/success.php on line 276
Warning: Trying to access array offset on value of type null in /www/wwwroot/w/show/success.php on line 276
**技巧**
重写时,子类重写方法的访问级别和父类虚拟方法的访问级别必须相同。如上例父类方法是public(public virtual void Display()),子类也必须是public级别。