C#中父类、子类方法 Virtual、Override、New关键字的区别

原创
2016/03/16 14:36
阅读数 976

创建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);

显示效果如下:

语法基础还是要搞清楚,否则以后难免踩雷。。。

展开阅读全文
加载中

作者的其它热门文章

打赏
1
0 收藏
分享
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部