在派生类上实现接口或覆盖基本方法

问题描述:

我有一个基类,我们在这里称之为BaseClass,它有2个派生类,ClassAClassB。在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()方法为基础的方法?

我可以看到两种方法都有优点和缺点。

实施IBarClassA仅给出了与ClassB相比具有附加功能能力的更清楚的指示。但这确实意味着ClassA将向公众披露Bar()方法,如果可能,我会尽量避免。

使用Bar()作为基本方法意味着它现在是集中式的,并且可以允许其派生类覆盖其实现。但在我们的案例中,ClassB也将具有Bar()的知识。

现在:是否有明确的技术理由更喜欢这些方法之一?是否有可能确定“更好”的选择?

+0

只是把Bar放在classA中就像一个普通的方法。 –

+0

@ M.kazemAkhgary感谢您的评论。但是如果将来需要一个新的派生类“ClassC”,并且需要'Bar()'的确切函数。 – woodykiddy

+0

您需要使用Bar()几个课程?它们是否在相同的用法?如果Bar()的用法相同,那么为什么不把它作为一个通用方法放在Base类中呢? – User2012384

这是近在我眼里就是“太自以为是”,但让我们尽力给那么事实的答案:

  • 增加另一个抽象方法的基础类需要所有派生类实现一个事情。这意味着它使扩展你的基类比需要更复杂。
  • 为什么?因为你将来会想到潜在需求。因此,请考虑YAGNI模式 - 谨慎处理您不需要立即执行的操作!
  • 如果“有Bar()”方法确实是“特殊”的东西;那么自然的结论是创建一个表达这个“特征”的特定界面;并有classB执行。

如果以后发现你的类将需要相同Bar()执行;你仍然可以创建一个BarImpl()类;并将该类的对象放入任何需要Bar()的类中(请记住这里的老式FCoI)!

我建议增加BaseClassBar类似如下:

public abstract class BaseClassBar : BaseClass 
{ 
    protected abstract void Bar();//if you don't want it to be public 
} 

然后让ClassABaseClassBar继承:

public class ClassA : BaseClassBar 
{ 
    protected override void Foo() 
    { 
     Bar(); 
    } 
} 

希望这是有益的。