我遇到了一个对我来说很新的问题。基本上,其他人已经写了A类。重要的部分看起来像这样
class A{
// some instance variables
public A(){
// Calls methods
build();
// Calls more methods
}
private build(){
item = makeItem();
anotherItem = makeAnotherItem();
// more code
}
private makeItem(){
// Does some things and calls updateItem()
}
private updateItem(){
// Does some things with instance variables of class A
// and calls yet another method in class A.
}
我的问题是build()完全符合我的需要,但我需要在另一个类中。现在有以下问题:
我猜这个问题实际上有一个名字,但我不知道它叫什么,因此只搜索了一些基本术语。如何在我的B类中使用build()?
答案 0 :(得分:2)
您在两个类中使用构建方法的代码但是继承没有用吗?然后,您可以使用组合重用构建方法的代码。 (提示Favor Composition over Inheritance)创建一个新的类C,其中包含构建方法。 C类由A类和B类通过组合使用。他们委托给C类的构建方法。
参见Martin Fowler的重构方法。
https://sourcemaking.com/refactoring/smells/duplicate-code 也看到了 https://sourcemaking.com/refactoring/replace-inheritance-with-delegation
答案 1 :(得分:0)
始终以小步骤重构。例如将所有东西放在一起,或许对另一个包含makeItem,makeAnotherItem和相应实例变量的类C有必要。没有一般性答案,这取决于您的代码的完整外观
答案 2 :(得分:0)
首先如果A类中的build()使用A的其他私有方法,那就好像你需要A类本身。
一个选项可能是创建包含公共方法(包括构建方法)的抽象类,并通过类A和B扩展此抽象类,这样就不会有重复的代码
如果由于某种原因你不想触摸A类,我建议你创建一个界面,如:
public interface Builder{
void build()
}
然后由类B实现此接口,并且还扩展类A,以便您实现构建方法。
public class B extends A implements Builder{
// build() of class A will be used
// do other staff
}
这样做完全没有对A类进行任何更改(如果它是遗留代码或其他内容,则可能需要这样做)+ Builder可以用作要公开的API中的类型。