C#继承和多态

刚学习了C#继承和多态,对virtual、override、seal override、new有点了解,在此写下这篇文章以供以后参考,若有错误或不足,还望各位指出。

这里有3个类,分别是GrandFather、Father、Son。好,我们现在来分析一下GrandFather的遗产怎么让Father继承,Son又怎么处理从Father继承的遗产。

    class GrandFather
    {       
        // 对于可能被重写的方法,必须显式使用关键字virtual,只有声明为virtual的成员才能被override
        protected virtual void Legacy1()
        {
        }

        protected virtual void Legacy2()
        {
        }

        protected virtual void Legacy3()
        { 
        }
    }

    class Father: GrandFather
    {
        protected override void Legacy1() { }

        //隐藏(Hide)基类成员,重新定义非virtual基类成员时需要使用new,
        //可以看出返回类型可以修改,但是不能改变签名
        public new int Legacy2()    //没有new会有警告
        {
            return 123;
        }

        // 将继承的方法重写并密封,子类不会再重写
        protected sealed override void Legacy3()
        {  
        }
    }

    class Son: Father
    {
        // 可以再次重写
        protected override void Legacy1()
        {     
        }

        //此方法是错误的,并有重写父类的父类的方法,只能重写父类的方法,此时需要在父类加上virtual关键字
        //public override int Legacy2(int id)
        //{
        //    return id;
        //}

        // 这是新的方法,没有重写
        protected new void Legacy3()
        {   
        }
    }

首先,我们看看第一份遗产Legacy1(),GrandFather声明virtual的,告诉Father:你可以拿掉我这份遗产将其发扬光大(override)。Father总算没有败家,又将其传给了Son,Son又再一次将其发扬光大(override)。

接着来看看第二份遗产Legacy2(),GrandFather依然告诉Father,你可以继承我这份遗产。谁知,Father很争气,要自己另立门户new了一个,但是招牌(签名)还是没丢掉,只是改变了管理的方式。好了终于到了Son了,Son想“子承父业”想将Legacy2()发扬光大(重写),但是发现“老子”真不靠谱,竟然没给继承。此时,想起爷爷来了,就跑去问阿爷要。谁知,中间隔了个“老子”,想继承也继承不了。后来死皮赖脸地去求老子给virtual一下Legacy2(),老子没答应,就放弃了。

最后,看看第三份遗产Legacy3(),这老子GrandFather真给力,什么都给Father了,真特么是亲生的。儿子也是“争气”啊,毫无保留地留给自己了,连自己的儿子Son都不给了sealed override,估计发现儿子姓王了。那么Son就是只能自己白手起家new一个了。

本人知识有限,若有不对,还望指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值