Java - 是否可以使用单个类扩展类的所有子类?

Fra*_*dan 6 java inheritance

Java - 是否可以使用单个类扩展类的所有子类?

让我们用一个例子来解释它,实际的代码要复杂得多.我有一个Animal类,它有自己的类层次结构.假设它有两个子类:Testarrosa和Viper.

public class Car {

    public abstract String getManufacturer();
}

public class Testarossa extends Car{

    public String getManufacturer(){
        return "Ferrari";
    }
}

public class Viper extends Car{

    public String getManufacturer(){
        return "Dodge";
    }
}
Run Code Online (Sandbox Code Playgroud)

我想用RegisteredCar子类扩展所有Car子类.

public class RegisteredCar extends Car {

   private String plateNumber;

   public RegisteredCar (String plateNumber){
       this.plateNumber=plateNumber;
   }

   public String getPlateNumber() {
       return plateNumber;
   }
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,我应该能够创建一个特定子类的新RegisteredCar.就像是

RegisteredCar c = new RegisteredCar<Viper>("B-3956-AC");
Run Code Online (Sandbox Code Playgroud)

并调用c.getManufacturer()获取"Dodge"和c.getPlateNumber()以获得B-3956-AC.显然,我仍然可以创建一个Car c = new Viper();

这是一个例子.如果没有注册,在Car中具有空值的属性不足以满足我的需要.

Rob*_*gam 10

简而言之,这是不可能的.不幸的是,您必须修改对象模型.

例如,以Registration这种方式拥有一个类:

public interface Registration<C extends Car> {
    C getCar();

    String getPlateNumber();
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以在保持Car模型的同时,在单个班级中提取与注册相关的信息.

然后你可以做辅助方法,如:

Registration<Viper> registeredViper = createRegistration(new Viper(), "B-3956-AC");
Run Code Online (Sandbox Code Playgroud)


Gav*_*vin 4

正如其他人所说,不,这实际上不可能,您的示例可以通过更改模型来解决

作为继承的替代方法,您可以使用另一个类来包装Car实例。
我会创建Car一个接口(尽管RegisteredCar扩展Car也应该起作用),然后尝试类似以下伪代码的操作:

class RegisteredCar<T extends Car> implements Car {
   private final  T car

   RegisteredCar(T car) {
     this.car = car;
   }

   ... methods for RegisteredCar
   ... methods from Car delegating to `this.car`
}
Run Code Online (Sandbox Code Playgroud)

请原谅有些糟糕的代码,我没有打开 IDE,而且我总是在没有 IDE 的情况下搞乱泛型。

另一个可能的解决方案是使用 AOP,尽管我不知道现在流行的如何,但您所描述的可能是一个横切问题。

最后的替代方案可能是使用允许扩展、特征、协议或某种其他类型“混合”的语言