【问题标题】:Can a class that extends a base class be extended to be based only on an extension?扩展基类的类可以扩展为仅基于扩展吗?
【发布时间】: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


【解决方案1】:

如果我理解您的问题,参考您的 Person 示例,Person 类似乎在两个方向上进行了扩展,即 Age 和 Work。 接受 Age 方向因为在库中无法触及,涉及 Work 方向的继承关系有问题。 所以,如果你是 a,我会使用 composition

该库还有几个子类 CHILD、YOUTH、MIDDLE_AGE 和 ELDERLY,每个都有自己的属性/方法。

这句话开启了两个场景:

  1. 员工需要在 Person 抽象类中声明的方法
  2. 员工需要在 Person 子类中声明的方法

场景 1 最简单:Employee 拥有对 Person 对象的引用,并通过转发来调用 Person 的方法。

public abstract class Employee{
    private Person person;
    //... 

    Employee(Person p){
       this.person=p;
    }

    public getName(){      // basic example
       person.getName();
    }

场景 2(在我看来是你的情况)紧随前一个,但有点复杂,因为它需要应用于需要在“年龄子类”中声明的方法的每个“工作子类”。 关注 Retiring 的情况,这种方法要求 Retiring 对象直接拥有对 Enderly 的引用。

public class Retiring extends Employee{
     private Enderly enderly;

     Retiring( Enderly e){
       this.enderly=e;
     }

     public getBenefits(){
         enderly.getMoney();
     }

【讨论】:

  • 场景 2 是正确的,并且提供的答案对于我提出问题的方式是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多