创建1个父类BaseClass,包含3个方法:VirtualPrint( )、OverridePrint( )、ShadowPrint( )
public class BaseClass
{
public virtual void VirtualPrint()
{
Console.WriteLine("BaseClass : VirtualPrint");
}
public virtual void OverridePrint()
{
Console.WriteLine("BaseClass : OverridePrint");
}
public virtual void ShadowPrint()
{
Console.WriteLine("BaseClass : ShadowPrint");
}
}
创建1个子类DerivedClass,分别重写、投射父类方法:
public class DerivedClass:BaseClass
{
public override void OverridePrint()
{
Console.WriteLine("DerivedClass : OverridePrint");
}
public new void ShadowPrint()
{
Console.WriteLine("DerivedClass : ShadowPrint");
}
}
在Program的Main函数中,分别创建父类、子类实例,并调用其全部方法:
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
Console.WriteLine("VirtualPrint() Of Two Class :");
bc.VirtualPrint();
dc.VirtualPrint();
Console.WriteLine("OverridePrint() Of Two Class :");
bc.OverridePrint();
dc.OverridePrint();
Console.WriteLine("ShadowPrint() Of Two Class : ");
bc.ShadowPrint();
dc.ShadowPrint();
Console.WriteLine("-------------------------------");
显示效果如下:
创建3个传入BaseClass类型变量的方法,用来显示区别:
static void ShowVirtualPrintDiff(BaseClass b)
{
b.VirtualPrint();
}
static void ShowOverridePrintDiff(BaseClass b)
{
b.OverridePrint();
}
static void ShowShadowPrintDiff(BaseClass b)
{
b.ShadowPrint();
}
在Main函数中,调用上面的方法分别传入父类、子类实例:
Console.WriteLine("ShowVirtualPrintDiff : ");
ShowVirtualPrintDiff(bc);
ShowVirtualPrintDiff(dc);
Console.WriteLine("ShowOverridePrintDiff : ");
ShowOverridePrintDiff(bc);
ShowOverridePrintDiff(dc);
Console.WriteLine("ShowShadowPrintDiff : ");
ShowShadowPrintDiff(bc);
ShowShadowPrintDiff(dc);
Console.WriteLine("-------------------------------");
Console.ReadLine();
显示效果如下:
可以看到,对于投射New 的子类方法,调用的仍然是父类的方法。重写Override则调用子类方法。
如果想在传入父类类型的方法中,仍然使用子类投射New的方法,可先判断传入的变量是否为子类类型,如是则调用子类方法:
static void ShowShadowPrintDiffCorrect(BaseClass b)
{
if(b is DerivedClass)
{
(b as DerivedClass).ShadowPrint();
}
else
{
b.ShadowPrint();
}
}
回到Main函数中,调用2次,显示父类子类区别:
Console.WriteLine("ShowShadowPrintDiffCorrect : ");
ShowShadowPrintDiffCorrect(bc);
ShowShadowPrintDiffCorrect(dc);
显示效果如下:
语法基础还是要搞清楚,否则以后难免踩雷。。。