扩展基类的类是否可以扩展为仅基于扩展名?

时间:2018-04-14 04:28:47

标签: java oop inheritance design-patterns subclassing

我意识到标题令人困惑,但我想不出怎么在没有书的情况下问它。我的问题是:我有一个扩展库基类的抽象类。该依赖库类也有子类。然后我从抽象类中获得了一系列子类。问题是我的一个子类要求抽象基于其中一个库子类,而其他所有子类只需要原始基类。

举个例子,假设我有一个带有PERSON类的库。该库还有几个子类CHILD,YOUTH,MIDDLE_AGE和ELDERLY,每个子类都有自己的属性/方法。在我的代码中,我有一个扩展PERSON的抽象类EMPLOYEE。它有几个子类NEW_HIRE,LINE_WORKER,MANAGER和RETIRING。大多数情况下只使用PERSON类方法,但RETIRING子类只有PERSON类型实际上是一个ELDERLY(它需要该类中的某些方法)才有效。该库是不可变的,因此我无法对其进行更改。

另一个示例是基于集合类型(如Set)的代码,但是有一个特定的子类需要该集合为TreeSet(例如,它需要ceiling()功能)。

有没有办法指定这个?

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,似乎在引用你的Person示例时,Person类在两个方向上扩展,Age和Work。 接受因为它在库中而无法触及Age方向,涉及工作方向的继承关系是有问题的。 所以,如果是你,我会使用组合

  

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

这句话打开了两个场景:

  1. 员工需要在Person抽象类
  2. 中声明的方法
  3. 员工需要在Person子类中声明的方法
  4. 场景1是最简单的:Employee拥有对Person对象的引用,并且它通过转发调用Person的方法。

    public abstract class Employee{
        private Person person;
        //... 
    
        Employee(Person p){
           this.person=p;
        }
    
        public getName(){      // basic example
           person.getName();
        }
    

    场景2(在我看来似乎是你的情况)遵循前一个,但有点复杂,因为它需要应用于需要在“Age子类”中声明的方法的每个“Work子类”。 关注退休案例,这种方法要求Retiring对象直接拥有对Enderly的引用。

    public class Retiring extends Employee{
         private Enderly enderly;
    
         Retiring( Enderly e){
           this.enderly=e;
         }
    
         public getBenefits(){
             enderly.getMoney();
         }