我有以下的类结构,并且有很多像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 other code
base.OnShow();
}
}
class C : B
{
protected override void OnShow()
{
//some other code
base.OnShow();
}
}
答案 0 :(得分:5)
不要从B扩展C,而是创建一个从A扩展的新类“X”,并且具有B和C所需的当前部分,然后使C和B从“ X”。然后B将只具有你想要的B中的位(有点抽象,但我觉得这很有意义)。
一般来说,如果你试图跳过父方法,那么你做错了。
答案 1 :(得分:2)
Eric Lippert已经回复了very similar question,并且基本上声明C#中不允许这样做。
答案 2 :(得分:2)
这听起来像是一个设计问题。如果C确实是B,它可能应该完成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
}
}
这是一个可怕的模式,如果你能想出一个更好的方法来重新设计对象/功能,我不会推荐它。