C# 如何跳过即时基类重写函数
我有下面的类结构,有很多类,比如从B派生的C,在一些类中我不希望由B.OnShow()执行,但我希望A.OnShow()从C执行有什么技巧吗C# 如何跳过即时基类重写函数,c#,oop,C#,Oop,我有下面的类结构,有很多类,比如从B派生的C,在一些类中我不希望由B.OnShow()执行,但我希望A.OnShow()从C执行有什么技巧吗 abstract class A { protected virtual void OnShow() { //some code base.OnShow(); } } class B : A { protected override void OnShow() { //some
abstract class A
{
protected virtual void OnShow()
{
//some code
base.OnShow();
}
}
class B : A
{
protected override void OnShow()
{
//some other code
base.OnShow();
}
}
class C : B
{
protected override void OnShow()
{
//some other code
base.OnShow();
}
}
已经回答了一个问题,基本上说它在C#中是不允许的。这听起来像是一个设计问题。如果C真的是ab,那么它可能会完成B在OnShow中需要做的所有事情。如果不是,您可能应该使用直接继承以外的东西,或者使用单个虚拟函数调用以外的东西 如果你真的想,你可以:
abstract class A
{
protected virtual void OnShow()
{
UniqueOnShowStuff();
base.OnShow();
}
protected virtual void UniqueOnShowStuff()
{
//
}
}
class B : A
{
protected override void OnShow()
{
// Things all B's need to Show
base.OnShow();
}
protected override void UniqueOnShowStuff()
{
// Things most B's might want to show but don't have to
}
}
class C : B
{
protected override void OnShow()
{
// Things all C's need to show
base.OnShow();
}
protected override void UniqueOnShowStuff()
{
// override without a base call so you don't show B's things
}
}
这是一个可怕的模式,如果你能想出一个更好的方法来重新设计对象/功能的话,我不建议你这么做。不要让C从B扩展,而是创建一个新的类“X”,它从a扩展,并且拥有你想要的B和C当前在B中的部分,然后让C和B从“X”扩展。然后,B将只包含你想要的B的位(有点抽象,但我认为这是有意义的) 一般来说,如果您试图跳过父方法,那么您就做错了。可能重复的