class 设计:将派生 class 添加到遗留继承层次结构
class design: add derived class to a legacy inheritance hierarchy
说我有
Class Base
{
public void foo() //a public interface to user
{
doA();
doB();
}
protected void doA(){...} //common implementation
protected void doB(){} //type specific implementation
}
Class Derived1 extends Base
{
int a,b,c,d,e,f,g; //bulky, clumsy implementation details specific to Derived1
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Base
{
@Override
protected void doB(){...} //a different implementation for Derived2
}
如果我错了请纠正我,这个优于:
Class Derived1 extends Base
{
int a,b,c,d,e,f,g; //bulky, clumsy implementation details specific to Derived1
@Override
protected void doA(){...} //move the common implementation to Derived1
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Derived1
{
@Override
protected void doB(){...} //a different implementation for Derived2
}
因为后者将Derived1的内部暴露给Derived2。
我的问题是,假设 Derived1 和 Base 来自现有的继承层次结构,并且 Derived1 已经覆盖了 doA() 和 doB()。在不更改遗留代码的情况下添加新 Derived2 的最佳方法是什么?
由于 Derived2 与 Derived1 具有相同的 doA() 实现,因此我不得不接受较差的第二个选项。我考虑了组合并将 Derived1 作为 Derived2 的成员,但是 doA() 受到保护,因此我们无法从 Derived2 访问它。
非常感谢您的回复!
首先,我认为你的问题有误:方法doA
和doB
被声明为private
。子 类 无法访问其父的私有方法,并且方法重写是不可能的。
在您的示例中,如果您调用 Derived1.foo()
,则只会调用 Base.doA()
。
您应该将它们声明为protected
以允许方法覆盖。
在那种情况下,我认为第二个选项是可以接受的,但这取决于实际代码。
Class Base
{
public void foo() //a public interface to user
{
doA();
doB();
}
protected void doA(){...} //common implementation
protected void doB(){} //type specific implementation
}
Class Derived1 extends Base
{
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Base
{
@Override
protected void doB(){...} //a different implementation for Derived2
}
说我有
Class Base
{
public void foo() //a public interface to user
{
doA();
doB();
}
protected void doA(){...} //common implementation
protected void doB(){} //type specific implementation
}
Class Derived1 extends Base
{
int a,b,c,d,e,f,g; //bulky, clumsy implementation details specific to Derived1
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Base
{
@Override
protected void doB(){...} //a different implementation for Derived2
}
如果我错了请纠正我,这个优于:
Class Derived1 extends Base
{
int a,b,c,d,e,f,g; //bulky, clumsy implementation details specific to Derived1
@Override
protected void doA(){...} //move the common implementation to Derived1
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Derived1
{
@Override
protected void doB(){...} //a different implementation for Derived2
}
因为后者将Derived1的内部暴露给Derived2。
我的问题是,假设 Derived1 和 Base 来自现有的继承层次结构,并且 Derived1 已经覆盖了 doA() 和 doB()。在不更改遗留代码的情况下添加新 Derived2 的最佳方法是什么?
由于 Derived2 与 Derived1 具有相同的 doA() 实现,因此我不得不接受较差的第二个选项。我考虑了组合并将 Derived1 作为 Derived2 的成员,但是 doA() 受到保护,因此我们无法从 Derived2 访问它。
非常感谢您的回复!
首先,我认为你的问题有误:方法doA
和doB
被声明为private
。子 类 无法访问其父的私有方法,并且方法重写是不可能的。
在您的示例中,如果您调用 Derived1.foo()
,则只会调用 Base.doA()
。
您应该将它们声明为protected
以允许方法覆盖。
在那种情况下,我认为第二个选项是可以接受的,但这取决于实际代码。
Class Base
{
public void foo() //a public interface to user
{
doA();
doB();
}
protected void doA(){...} //common implementation
protected void doB(){} //type specific implementation
}
Class Derived1 extends Base
{
@Override
protected void doB(){...} //implementation for Derived1
}
Class Derived2 extends Base
{
@Override
protected void doB(){...} //a different implementation for Derived2
}