我意识到标题令人困惑,但我想不出怎么在没有书的情况下问它。我的问题是:我有一个扩展库基类的抽象类。该依赖库类也有子类。然后我从抽象类中获得了一系列子类。问题是我的一个子类要求抽象基于其中一个库子类,而其他所有子类只需要原始基类。
举个例子,假设我有一个带有PERSON类的库。该库还有几个子类CHILD,YOUTH,MIDDLE_AGE和ELDERLY,每个子类都有自己的属性/方法。在我的代码中,我有一个扩展PERSON的抽象类EMPLOYEE。它有几个子类NEW_HIRE,LINE_WORKER,MANAGER和RETIRING。大多数情况下只使用PERSON类方法,但RETIRING子类只有PERSON类型实际上是一个ELDERLY(它需要该类中的某些方法)才有效。该库是不可变的,因此我无法对其进行更改。
另一个示例是基于集合类型(如Set)的代码,但是有一个特定的子类需要该集合为TreeSet(例如,它需要ceiling()功能)。
有没有办法指定这个?
答案 0 :(得分:0)
如果我理解你的问题,似乎在引用你的Person示例时,Person类在两个方向上扩展,Age和Work。 接受因为它在库中而无法触及Age方向,涉及工作方向的继承关系是有问题的。 所以,如果是你,我会使用组合。
该库还有几个子类CHILD,YOUTH,MIDDLE_AGE和ELDERLY,每个子类都有自己的属性/方法。
这句话打开了两个场景:
场景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();
}