创建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);
显示效果如下:
语法基础还是要搞清楚,否则以后难免踩雷。。。