读取项目的代码,我注意到了这种情况,有两个类如下例所示:
class A {
private class E aE;
private class F aF;
public A(){
aE = new E();
aF = new F();
}
public void foo1(){
aE.bar();
...
aF.poo();
}
}
class B implements Runnable {
private class E aE;
private class F aF;
public B(){
aE = new E();
aF = new F();
}
public void run(){
...
x = aE.bar()
...
}
}
我会重构这段代码以获得超类A,但是顺便说一句,最好在A类中使字段aE和aF受保护并在类B中使用它们或在A类中添加两个方法作为getE()和getF()并在B类中使用此方法?
答案 0 :(得分:2)
类B
不会扩展A
,它似乎是一个简单的复制粘贴作业,其中包含实现Runnable
所需的方法。你显然应该避免这种情况,并制作另一个专门用于运行应用程序的类,之后你可能不需要类B
。
答案 1 :(得分:0)
Mark,从这个例子中很难指出你应该如何重构这段代码。以下是一些可能性 -
是否拥有A和B的公共父类取决于实际类之间是否存在逻辑父子关系。
如果存在关系,您也可以从A扩展B类。在这种情况下,您必须将aE和aF公开为公共属性。
另一种可能性是您可以在A上实现Runnable,从而消除B类。
如果同时将E类和F类作为私有字段放在一起很常见,那么您可以考虑将它们封装在一个类型中,比如EF,然后用该类组成其他类。
< / LI> 醇>但是,只有在知道了实际的课程后才能给出正确的答案。
答案 2 :(得分:0)
关于名为“A”和“B”的类的任何声明可能没有足够的上下文可能是错误的或正确的。
但我想,假设一个B扩展A是合理的情况,几乎总是喜欢使用受保护或包级数据成员访问。如果你有一个正式且严重到足以使用Get / Set访问器的接口,那么你可能在实现继承是一个很好的设计选择的上下文之外。