1.编译时的多态性:通过方法重载实现
一个类的对象调用若干同名方法,系统在编译时,根据调用方法的实参类型及实参的个数决定调用那个同名方法,实现何种操作。
2.运行时的多态性:通过虚方法实现(在方法声明前加上virtual修饰符为虚方法)
在系统运行时,不同对象调用一个名字相同,参数的类型及个数完全相同的方法,会完成不同的操作。
using System;
class A{
public void F(){ //非虚方法
Console.Write(" A.F");
}
public virtual void G(){ //虚方法
Console.Write(" A.G");
}
static void F2(A aA){
aA.G();
}
}
class B:A
{
new public void F(){ //覆盖基类的同名非虚方法F(),注意使用new
Console.Write(" B.F");
}
public override void G(){ //覆盖基类的同名虚方法G(),注意使用override
Console.Write(" B.G");
}
}
class Test{
static void Main(){
B b=new B();
A a1=new A();
A a2=b; //允许基类引用变量引用派生类对象,重点:a2引用派生类B对象b!!!
a1.F(); //A.F
a2.F(); //非虚方法,A.F
b.F(); //B.F
a1.G(); //G()为虚方法,因a1引用基类A对象,调用基类A的G(),A.G
a2.G(); //G()为虚方法,因a2a2引用派生类B对象,调用派生类的G(),B.G
F2(b); //由于A aA=b, B.G
F2(a1); //A.G;
}
应用:如在Person类中,公有方法Display()来显示个人信息,在派生类中Employee中,覆盖了基类的公有方法Display(),以显示新增信息。若希望隐藏这些细节,无论基类还是派生类,都调用一个显示方法,根据对象的不同,自动显示不同的信息,就可以用虚方法实现。