刚学习了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一个了。
本人知识有限,若有不对,还望指出。
1691

被折叠的 条评论
为什么被折叠?



