想到的第一个答案是“一般来说,不”。
为了使其合理,A 和 B 应该是其他事物的特例——尽管这是可行的,但似乎不太可能。
除此之外,我看不出有任何理由组合任何代码(还有很多不这样做的理由)。是否有某种原因你不能简单地让它们都扩展 X,并将所有代码留在原处?
我认为我还没有足够的信息来获得清晰的图片,但会继续使用我目前所拥有的信息。
如果您实现了 Class A 和 Class B 都扩展的 Class X,那么这不会改变任何子类或任何一个类或任何子类的任何使用。这当然是我要开始的地方。
public Class X implements Serializable {}
public Class A extends X implements Serializable
{
// retain all current code to start
}
public Class B extends X implements Serializable
{
// and here be all current code also
}
您说您目前正在考虑将 B 类合并到 A 类中;这听起来有问题;A 和 B 共享“大约一半”的代码,并且在它们下面都有一个大的继承树——实例化 A 类子类的东西可以通过让 A 获得一些新功能来改变其行为。
所以相反,我会慢慢地将事物从 A 移动到 X 并从 B 移动到 X。只有当它们在 A 和 B 树之间具有共性时,我才会尝试移动它们。
例如,假设您在 A 中有方法 abc(),在 B 中有 def() 具有相同的功能。您可以将此功能移至 X 并随心所欲地调用它 - 我可能会尝试给它起一个我认为最能描述其功能的名称,无论它来自 A、B 还是我编造的一个新名称。然后 abc() 和 def() 可以调用这个新函数,并且可以从它们中删除这些方法的代码。
public class X implements Serializable
{
public void abcdef()
{
// common functionality, merged from A and B
}
}
public class A extends X implements Serializable
{
public function abc() { abcdef(); }
}
public class B extends X implements Serializable
{
public function edf() { abcdef(); }
}
以这种方式进行的一个好处是,每一步都清楚地知道已经完成了什么。您可以用注释很好地标记它并对其进行审查,和/或对其进行测试以确保两种重构方法的功能都是完整和正确的;这可以在重构一个、两个或多个方法后完成,具体取决于您是否有用于审查和/或测试的良好设置。
唯一可能中断的情况是,由于某种原因,您希望两个继承树中的方法调用者发生变化,但我没有任何理由(还)认为这是必要的。希望所有方法至少有合理的名称来描述它们所做的事情并传递需要传递的参数,并且顶部的重构只影响实现,而不是调用。无论如何,这看起来是一项足够大的工作,我希望您不必更改调用和功能。