Java结合了两个大型继承链的父级

标签 java eclipse inheritance

我在一个巨大的项目中有两个父类,比如说ClassAClassB。每个类都有很多子类,子类又包含很多子类,子类又包含很多子类,等等。

我的任务是“联姻”这两个“家庭”,以便两者都继承单一 parent 的遗产。我基本上需要将 ClassAClassB 制作为一个类(父类)到它们的两个组合子类(子类)。

ClassAClassB 目前都实现了 Serializable

我目前正在尝试使两个继承链都从 ClassA 继承,然后将所有函数和数据成员从 ClassB 复制到 ClassA 中。这很乏味,而且我认为这是一个糟糕的解决方案。

解决这个问题的正确方法是什么?

编辑 - 一些说明

ClassAClassB 本质上做同样的事情(对许多存储过程的许多调用,当然是通过一系列许多类和方法调用)。

然而,

ClassA 通过我们实现的基于新服务的 (Jersey) 架构来调用一半的存储过程。我本质上是在“FamilyB”中实现新的面向服务的功能,就像我们在“FamilyA”中已经完成的那样。问题是这些家族中的每一个都非常庞大 - 许多类和长继承链,进行微小的更改会对继承链产生蝴蝶效应。

如果需要澄清,请告诉我。

最佳答案

我想到的第一个答案是“一般来说,不会”。

为了使这一点合理,A 和 B 应该是其他事物的特例 - 尽管这是可行的,但似乎不太可能。

除此之外,我没有看到任何理由组合任何代码(并且有很多理由不这样做)。是否有某种原因您不能简单地让它们都扩展 X,并将所有代码保留在原处?

<小时/>

我认为我还没有足够的信息来清晰地了解情况,但我会按照目前所掌握的信息进行。

如果您实现了 A 类和 B 类都扩展的 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(); }
}

以这种方式进行的一个好处是,每一步都清楚地知道所做的事情。您可以用注释很好地标记它并对其进行审查,和/或对其进行测试以确保这两种重构方法的功能完整且正确;这可以在重构一种、两种或多种方法后完成,具体取决于您是否有良好的审查和/或测试设置。

唯一可能中断的情况是,由于某种原因,您希望更改两个继承树中方法的调用者,但我(还)没有任何理由认为这是必要的。希望所有方法至少都有合理的名称来描述它们的作用并传递需要传递的参数,并且顶部的重构仅影响实现,而不影响调用。无论如何,这看起来是一项足够大的工作,我希望您不必更改调用和函数。

关于Java结合了两个大型继承链的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869010/

相关文章:

java - 匹配 3 个或更多连续连续字符和连续相同字符的正则表达式

java - 是否需要反射才能动态地将正确的通用适配器应用于我的对象

java - 从 context.xml 文件获取数据库凭据

java - 归并排序算法错误

c# - 为什么 SWIG C# 重载失败?

java - Java 中的每个子类都继承自两个类(Object 及其父类(super class))?

java - Eclipse 调试器中是否有办法在 Java 对象的状态发生更改时收到通知?

java - 我们可以将多个记录作为单个 java 请求加载到 mysql-DB 的多个表中吗?

c++ - 跨平台 C++ 代码架构

java - 如何使用java制作图像的渐变边框?