扩展Java中静态方法返回的对象

我有以下问题.

我有一个库类的静态方法(无法更改),如下所示:

Loader.loadModel()

它返回一个Model类型的对象.

我还创建了一个名为ExtendedModel的Model子类,该子类向Model添加了一些方法和某些字段.

我不能做:

ExtendedModel m = Loader.loadModel() //compiler error
ExtendedModel m = (ExtendedModel) Loader.loadModel() //ClassCastException at runtime

因为在Java中,您不能将超类的对象分配给子类.

但是,我想知道:这是将方法和字段添加到Loader.loadModel()返回的对象的最佳方法

解决方法:

尽管您添加了新类,但是您没有该类的新实例.为了能够使用模型的其他方法和字段,您需要具有ExtendedModel的实例. Loader.loadModel()返回“常规”模型的实例,从而导致问题.

要扩展对象的功能,您需要编写包装器类.包装器通常采用“基本”类的对象,将基本功能委托给它,并添加其自身的一些方法/变量:

public class ExtendedModel : Model {
    private final Model wrapped;
    public ExtendedModel(Model model) { wrapped = model; }
    private int addedField = 123;
    // Methods of the Model that you did not change simply forward the calls:
    public void doSomething() { wrapped.doSomething(); }
    public int calculateSomething() { return wrapped.calculateSomething(); }
    // Extended methods do whatever you need them to do:
    public int getAddedField() {return addedField;}
    public void increment() {addedField++;}
}

现在您可以创建ExtendedModel的实例,如下所示:

ExtendedModel m = new ExtendedModel(Loader.loadModel());
上一篇:java-如果方法是在超类中定义的,则如何根据调用它的对象更改结果


下一篇:python – 调用重写方法,超类调用重写方法