我有一个公共课A
。该类将在客户端和服务器端使用。但是在服务器端,它将暴露较少的API(客户端环境特定的API将不存在)。因此,我将这两种环境共有的核心API提取为一个抽象的隐藏超类ASuper
。这就是将A
分为A
和ASuper
。
我所面临的问题是许多核心API都返回<T extends A>
类型的对象。因此,超类正在引用其子类,这是违反继承原则的。我不想覆盖A中的每个这样的API(由于大量的这些API)。我也不想将方法签名更改为<T extends ASuper>
。有人可以帮我这个吗?
答案 0 :(得分:0)
嗯,正确的解决方案将是您尝试避免的 - 改变签名。更好的是,从ASuper
中提取界面并使您的API返回此界面而不是具体实现。
但是,如果您需要一些解决方法,我只能对此方法进行映像:而不是提取超类ASuper
提取子类AChild
。在这种情况下,您现有的方法将返回超类A
而不是子类。稍后您可以重命名父类和子类(我希望您的IDE支持这种重构)。
答案 1 :(得分:0)
你不应该将ASuper重构为A的超类,因为正如你所指出的那样会创建一个糟糕的继承结构。您应该遵循Composition over inheritance的主体并将ASuper的实例传递给A的构造函数。