我有很多基本相同的类,即在各方面都具有几乎相同的功能。让我们称它们为A和B.有数百种方法使用A,现在由于代码更改,我必须将它们更改为B.
有没有一种方法可以编写A和B之间的映射,这样我的代码更改很少?
答案 0 :(得分:2)
您应该定义A和B都实现的接口。
答案 1 :(得分:2)
如果A
不是final
,您可以制作B extends A
,并拥有B
方法@Override
A
。然后,无论您以前在instanceof A
上调用方法,现在都提供instanceof B
,让动态调度处理其余的。
这称为多态性。它仅适用于具有相同确切签名的非static
方法。您不能@Override
static
方法。
根据您这样做的原因,您应该了解接口的概念以及它们如何在面向对象的编程中使用,以准确地实现这种灵活性和便利性。
例如,考虑interface List<E>
和实施ArrayList<E>
。如果您编写了一个与ArrayList<E>
一起使用的完整库,执行所有常用的add/addAll/remove
等,现在您必须使用LinkedList<E>
代替,那么您别无选择,只能去到源代码并将所有ArrayList<E>
更改为LinkedList<E>
,并希望更改不会破坏仍假定使用ArrayList<E>
的其他代码。
如果您的库使用List<E>
,则只需在创建对象的任何位置切换到LinkedList<E>
。执行add/addAll/remove
的所有其他代码仍然可以正常工作,因为这些是interface List<E>
中定义的方法,所有实现者都将使用这些方法。
目前的情境并不清楚,但如果A
和B
如此相似,那么它们可能属于某种类型X
。如果是这样,您应该考虑定义interface X
,并A implements X
和B implements X
。
答案 2 :(得分:1)
嗯,在这种情况下你应该使用继承。
如果您将B
作为A
的子类,则可以在B
使用A
而无需更改任何代码。
Sun / Oracle已some great tutorials on inheritance您可能需要查看才能开始使用。
答案 3 :(得分:1)
你可以为A做一个adapter。等等。
class A {
private B b = new B();
public String someMethod() {
return b.equivalentSomeMethod();
}
}
如果方法类似,而不是完全相同的。如果它们完全相同 - 使用您的IDE删除其中一个类并将其替换为另一个类。
答案 4 :(得分:1)
有很多种方法,每种方式都有优点和缺点。一些想法:
使B成为A的子类型。然后,您可以将B的实例传递给需要A的方法。或者,提取一个公共接口,并在可能的情况下将A的使用替换为该接口(一个好的IDE可以自动执行此操作)。 / p>
在A中,包含以下构造函数:
A(B b) {
// create an A with the data from b
}
或创建一个子类A并将所有调用委托给B的适配器。
在任何情况下,如果最大限度地减少更改代码的繁琐是您的目标,请查看IDE的重构操作。