【问题标题】:Extract core functionalities out of a class [duplicate]从类中提取核心功能[重复]
【发布时间】:2015-10-26 05:08:00
【问题描述】:

我有一个公共课程A。此类将用于客户端和服务器端。但在服务器端,它会暴露较少的 API(不存在客户端环境特定的 API)。因此,我将两种环境共有的核心 API 提取到一个抽象的隐藏超类 ASuper 中。这就是将A 拆分为AASuper
我在这样做时面临的问题是,许多核心 API 返回 <T extends A> 类型的对象。因此,超类引用其子类,这违反了继承原则。我不想覆盖 A 中的每个这样的 API(由于这些 API 的数量很大)。我也不想将方法签名更改为<T extends ASuper>。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 散文太多。尝试创建一个重现您的问题的最小示例。 stackoverflow.com/help/mcve
  • 除非您发布一些代码,否则没有人能比您上次提出这个问题时更能帮助您。

标签: java inheritance design-patterns


【解决方案1】:

好吧,正确的解决方案是做你试图避免的事情——改变签名。更好的是,从您的ASuper 中提取接口并让您的 API 返回此接口而不是具体实现。

但是,如果您需要一些解决方法,我可以仅对这种方法进行成像:而不是提取超类 ASuper 提取子类 AChild。在这种情况下,您现有的方法将返回超类 A 而不是子类。稍后您可以重命名父类和子类(我希望您的 IDE 支持这种重构)。

【讨论】:

    【解决方案2】:

    您不应该将 ASuper 重构为 A 的超类,因为正如您所指出的那样,这会创建一个糟糕的继承结构。您应该遵循Composition over inheritance 的原则,并将ASuper 的实例传递给A 的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多