我有以下问题.
我有一个库类的静态方法(无法更改),如下所示:
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());