基类定义了许多受保护的方法:它是一个好的OOP设计吗?

基类定义了许多受保护的方法:它是一个好的OOP设计吗?,oop,protected,Oop,Protected,我编写了一个基类,它定义了许多受保护的方法。这些方法在其子类中被调用。 这些方法为其子类定义基本操作。 例如: class Base{ protected void foo(){} protected void bar(){} } class Sub1 extends Base{//The sub class only needs Base.foo() public void po(){ ... foo(); ... } } class

我编写了一个基类,它定义了许多受保护的方法。这些方法在其子类中被调用。 这些方法为其子类定义基本操作。 例如:

class Base{
   protected void foo(){}
   protected void bar(){}
}

class Sub1 extends Base{//The sub class only needs Base.foo()
   public void po(){
     ...
     foo();
     ...
   }
}

class Sub2 extends Base{//The sub class only needs Base.bar()
   public void ko(){
     ...
     bar();
     ...
   }
}

class Sub3 extends Base{//The sub class needs both Base.bar() and Base.foo()
   public void lo(){
     ...
     bar();
     ...
     foo();
   }
}

我只是想知道这是否是一个好的OOP设计?阅读源代码,我们知道
Sub1
根本不需要
Base.bar()
Sub2
根本不需要
Base.foo()。我觉得这有点多余。但我不知道更好的解决办法,谁能给我一些建议?谢谢

通常,在设计中应该避免此类对象依赖关系。如果foo()和bar()的功能在派生类中没有更改,您可能希望将其放在外部类中并使用该类:

class Base{

}

class Helper1  {
   public void foo(){}
}

class Helper2  {
   public void bar(){}
}

class Sub1 extends Base{
   private Helper1 a = new Helper1();
   private Helper2 b = new Helper2();

   public void po(){
     ...
     a.foo();
     ...
     b.bar();
   }
}

class Sub2 extends Base{
   private Helper2 b = new Helper2();

   public void ko(){
     ...
     b.bar();
     ...
   }
}

这个foo&bar示例看起来不太好。您的问题可能是对对象的责任分配不当或继承的滥用。发布真实的代码将有助于写出更好的答案。

抱歉,但你的想法是错误的。问题不是“如果sub2继承base,它不需要该方法”

问题应该是“sub2是基础吗”例如青蛙是动物吗?是的,青蛙可以继承动物,但青蛙不应该继承哺乳动物

如果sub2是一个base,那么您的思路是正确的,如果base只是一组可能有用的函数,那么就有问题了

我的想法

1-如果您是第一次设计,请尝试遵循依赖注入的原则,因为我可以清楚地看到,您正在不同的子类中创建对象Helper1、Helper2,并且可能也在复制代码

2-如果您不需要Helper1和helper2的不同实例,我建议您在基类中创建Helper1和helper2作为属性,或者使它们成为虚拟的,这样您就可以在需要时过度信任它们

3-您直接编写实现,而您的客户机代码直接取决于具体类使用的接口,这将使您的类更易于测试

4-这里有一条金科玉律:如果你正在处理的问题不是那么复杂,而且你认为在不久的将来没有理由改变它们,而不是使用你正在做的事情,那么不要让你的生活变得复杂

所有好的oop编程都是好的,但是如果您看到一个比实现更简单的解决方案更好、更简单的解决方案,因为使用抽象,您将付出复杂性的代价

还有一个更重要的规则:看看你是否真的测试了你的类设计,而没有对你的设计进行修改,因为你的设计是正确的。

我知道这是一个坚实的规则问题


如果您的子类不需要所有基类函数,您可以将基类拆分为更具体的基类或接口is-a是OOD的黄金法则。