基类定义了许多受保护的方法:它是一个好的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的黄金法则。