【发布时间】:2018-04-14 04:28:47
【问题描述】:
我意识到标题令人困惑,但我想不出没有书怎么问。我的问题是:我有一个扩展库基类的抽象类。该依赖库类也有子类。然后我有一系列来自抽象类的子类。问题是我的一个子类要求抽象基于库子类之一,而所有其他子类只需要原始基类。
例如,假设我有一个类 PERSON 的库。该库还有几个子类 CHILD、YOUTH、MIDDLE_AGE 和 ELDERLY,每个子类都有自己的属性/方法。在我的代码中,我有一个扩展 PERSON 的抽象类 EMPLOYEE。它有几个子类 NEW_HIRE、LINE_WORKER、MANAGER 和 RETIRING。最简单地使用 PERSON 类方法,但 RETIRING 子类仅在 PERSON 类型实际上是 ELDERLY 时才有效(它需要该类中的某些方法)。该库是不可变的,因此我无法对其进行更改。
另一个例子是基于集合类型(如 Set)的代码,但有一个特定的子类,要求集合是 TreeSet(例如,它需要 ceiling() 功能)。
有没有办法指定这个?
【问题讨论】:
-
看起来你真正需要的不是接口就是装饰器。
-
如果需要 RETIRING 获取 ELDERLY 方法,可以让 ELDERLY 扩展 ELDERLY
-
这听起来像是XY Problem 类型的问题。这些类应该通过组合而不是继承成为 Person 的一部分。你的设计全错了,你正试图修复一个损坏的设计。别。将整个事情重构为一个更明智的整体。
-
例如,那些年龄说明符将是一个枚举,而 Person 将具有该枚举类型的字段。 WorkStatus 也是如此,一个枚举或单独的类,Person 将持有这种类型的字段。
-
我同意设计是一个问题,但这就是问题的原因。正如我所说,代码位于提供的库中,无法更改。它提供了一个框架,其中包含跨基本类型的操作。我的要求是创建一个正交辅助框架,其对象从库基类扩展(因此库框架继续在它们上运行),同时还支持辅助框架。
标签: java oop inheritance design-patterns subclassing