用户定义的类的类型转换

时间:2010-08-23 17:06:33

标签: java refactoring

我有很多基本相同的类,即在各方面都具有几乎相同的功能。让我们称它们为A和B.有数百种方法使用A,现在由于代码更改,我必须将它们更改为B.

有没有一种方法可以编写A和B之间的映射,这样我的代码更改很少?

5 个答案:

答案 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>中定义的方法,所有实现者都将使用这些方法。

目前的情境并不清楚,但如果AB如此相似,那么它们可能属于某种类型X。如果是这样,您应该考虑定义interface X,并A implements XB 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的重构操作。