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

在java中扩展静态方法返回的对象,java,oop,static,subclass,superclass,Java,Oop,Static,Subclass,Superclass,我有以下问题 我有一个库类的静态方法(我无法更改),如下所示: Loader.loadModel() ExtendedModel m = new ExtendedModel(Loader.loadModel()); Model m = Loader.loadModel(); 它返回一个Model类型的对象 我还创建了一个名为ExtendedModel的模型子类,它为模型添加了一些方法和字段 我不能这样做: ExtendedModel m = Loader.loadModel() //com

我有以下问题

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

Loader.loadModel()
ExtendedModel m = new ExtendedModel(Loader.loadModel());
Model m = Loader.loadModel();
它返回一个Model类型的对象

我还创建了一个名为ExtendedModel的模型子类,它为模型添加了一些方法和字段

我不能这样做:

ExtendedModel m = Loader.loadModel() //compiler error
ExtendedModel m = (ExtendedModel) Loader.loadModel() //ClassCastException at runtime
因为在Java中,不能将超类的对象分配给子类


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


这就是面向对象编程的工作原理。如果您想添加任何附加功能,编写一个helper类,其中包含静态方法,这些方法接受
模型
,并返回一些所需的值,例如
int
double
,…

,尽管您添加了一个新类,但您没有该类的新实例。为了能够使用模型的附加方法和字段,您需要有一个
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
的实例:

Loader.loadModel()
ExtendedModel m = new ExtendedModel(Loader.loadModel());
Model m = Loader.loadModel();

您不能,但您可以使用,它只是另一个类,将具有原始对象类型的字段,然后您可以对该对象执行操作。

您可以使用Java Reflect API。这提供了最简单的实现,但可能没有其他解决方案那么快

您基本上要做的是将所有数据从模型传递到ExtendedModel,并让ExtendedModel当然扩展模型

我的“模特”课:

当然,您也可以使用getter,而不是直接访问属性。这将帮助您轻松地将解决方案用于其他类/对象。唯一重要的是:

  • 声明一个默认构造函数(没有或有一组已知数量的参数)
  • 将所有数据从“Model”复制到“ExtendedModel”或任何要扩展的类

  • 你可以试试这个。你的解决方案总是需要一个粗糙的方法

    让“Loader.loadModel()”返回“ExtendedModel”的实例,但返回对象将设置为模型的引用。大概是这样的:

    Loader.loadModel()
    
    ExtendedModel m = new ExtendedModel(Loader.loadModel());
    
    Model m = Loader.loadModel();
    
    现在,您的演员将工作,如下所示

    ExtendedModel mx = (ExtendedModel) m;
    

    这与泛型之前的情况类似。在如上所示的特定情况下,允许向下播放。

    实际的类型是什么
    Loader.loadModel()
    return?您需要研究此方法,看看是否可以更改其默认行为。例如,它是否通过属性获取实现类?在特定情况下,可以将超类分配给子类。请参阅下面我的答案。您可以使用请求API(如我的答案中所述)对所有类和对象进行扩展。Loader.loadModel()返回的实际类型是Model,我无法更改它。遗憾的是,我无法更改Loader.loadModel()以使其返回“ExtendedModel”的实例