在派生类上实现接口或覆盖基本方法
问题描述:
我有一个基类,我们在这里称之为BaseClass
,它有2个派生类,ClassA
和ClassB
。在BaseClass
中定义了一个抽象方法Foo()
。所以这两个派生类都必须提供Foo()
的实现。在派生类上实现接口或覆盖基本方法
现在Foo()
在ClassA
的实际执行需要一个新功能,比如Bar()
,但ClassB
没有这样的要求。请参阅下面的代码示例。
public abstract class BaseClass
{
public abstract void Foo();
}
public class ClassA : BaseClass
{
public override void Foo()
{
// some implemented code...
// and additional method required
Bar();
}
}
public class ClassB : BaseClass
{
public override void Foo()
{
// some implemented code...
}
}
再就是我的问题是 - 我应该让ClassA
实现IBar
接口或者我应该做Bar()
方法为基础的方法?
我可以看到两种方法都有优点和缺点。
实施IBar
对ClassA
仅给出了与ClassB
相比具有附加功能能力的更清楚的指示。但这确实意味着ClassA
将向公众披露Bar()
方法,如果可能,我会尽量避免。
使用Bar()
作为基本方法意味着它现在是集中式的,并且可以允许其派生类覆盖其实现。但在我们的案例中,ClassB
也将具有Bar()
的知识。
现在:是否有明确的技术理由更喜欢这些方法之一?是否有可能确定“更好”的选择?
答
我建议增加BaseClassBar
类似如下:
public abstract class BaseClassBar : BaseClass
{
protected abstract void Bar();//if you don't want it to be public
}
然后让ClassA
从BaseClassBar
继承:
public class ClassA : BaseClassBar
{
protected override void Foo()
{
Bar();
}
}
希望这是有益的。
只是把Bar放在classA中就像一个普通的方法。 –
@ M.kazemAkhgary感谢您的评论。但是如果将来需要一个新的派生类“ClassC”,并且需要'Bar()'的确切函数。 – woodykiddy
您需要使用Bar()几个课程?它们是否在相同的用法?如果Bar()的用法相同,那么为什么不把它作为一个通用方法放在Base类中呢? – User2012384