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

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

显示效果如下:

142638_Xe5M_2260754.png

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

显示效果如下:

142957_1Brn_2260754.png

可以看到,对于投射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);

显示效果如下:

143358_O4pJ_2260754.png

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

转载于:https://my.oschina.net/u/2260754/blog/638497

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值