01
—
概述
多态使子类(派生类)的实例可以直接赋予基类的变量(这里不需要进行强制类型转换),然后直接就可以通过这个变量调用子类(派生类)的方法。
在派生于同一个类的不同对象上执行任务时,多态是一种极为有效的技巧,使用的代码最少。可以把一组对象放到一个数组中然后调用它们的方法,在这种情况下多态的作用就体现出来了,这些对象不必是相同类型的对象。当然如果它们都继承自某个类,可以把这些子类(派生类)都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
C#中,类的多态性是通过在子类(派生类)中重载基类的虚方法或函数成员来实现的。
02
—
实例
【例】 创建一个控制台应用程序,其中自定义一个MyClassl 类,该类中定义一个虚方法 Add,用来计算两个整数的和。然后自定义一个MyClass2类,该类继承于MyClassl 类,在 MyClass2类中重写MyClass1类中的虚方法。Program主程序类中,首先实例化子类MyClass2的一个对象,然后使用该对象实例化基类MyClassl的一个对象。这时,使用实例化的这两个对象都可以调用子类 MyClass2中的重写方法。
代码如下:
class MyClass1 //自定义类
{
private int x =0://定义int 型变量,作为加数
prvate int y=0; /定义int 型变量,作为被加数
public int x //加数
get
( return x ;
}
set
{
x = value;
}
}
public int Y //被加数
{
get
{
return y;
}
set
{
y=value;
}
}
public virtual int Add()//定义一个 virtual 类型的方法,以便在子类(派生类)中重写该方法,求和
return
{
x+Y;
}
}
class MyClass2:MyClass1 //自定义类,该类继承自 MyClass1
{
public override int Add() //重写基类中的虚方法
{
int x=5;
int y=7;
return x+y;
}
}
class Program
{
static void Main(string] args)
{
MyClass2 myclass2= new MyClass2(): //实例化 MyClass2的对象
//使用子类(派生类)MyClass2 的对象实例化基类MyClass1 的对象 MyClass1 myclass1 =(MyClass1)myclass2;
myclass1.X =3: /1为 MyClass1 类中的属性赋值
myclass1.Y =5; //为MyClass1类中的属性赋值
Console.WriteLine(myclass2.AddOk //调用子类(派生类)中的方法
Console.WriteLine(myclass1.Add(0)) /同样调用子类(派生类)中的方法
}
运行结果为12.
说明 :蓝子类(派生类)从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要
更改基类的数据和行为,有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。上面的实例重写了基类中的虚方法,另外,开发人员还可以使用新的派生成员替换基类的成黄,这时需要使用new关键字。如果基类定义了一个方法、字段或属性,则 new 关键字用于在子类(派生类)中创建该方法、字段或属性的新定义,new关键字放置在要替换的类成员的返回类型之前,例如,上面实例中重写基类中虚方法的代码也可以替换为下面的形式。
class MyClass2:MyClass1
{
public new int Add() //重写基类中的虚方法,返回两个int型变量相加的和
{
int x=5;
int y=7;
return x+y;
}
}
总结:
① virtual 修饰符不能与 private static、abstract 或者 override 修饰符同时使用。
② overide 修饰符不能与 new、static 或者 virtual修饰符同时使用,并且重写方法只意于重写基类中的虚方法.
@ C#中、继承、虚方法和重写方法组合在一起才能实现多态性。