【问题标题】:Java add methods to super class [duplicate]Java向超类添加方法[重复]
【发布时间】:2017-12-27 17:52:55
【问题描述】:

我有一个无法访问其源代码的类。

public class IDontHaveAccessToSource {...}

我想给它添加一些方法,像这样:

public class MyClass extends IDontHaveAccessToSource {
    myMethod1() {...}
    myMethod2() {...}

    @Override
    methodInIDontHaveAccessToSource(){...}
}

但每当我想将任何返回 IDontHaveAccessToSource 的内容转换为 MyClass 时,它都会给我一个 ClassCastException

我该怎么做?

我不想用

public class MyClass {
    IDontHaveAccessToSource obj;

    MyClass(IDontHaveAccessToSource obj) {
        this.obj = obj;
    }
    ...
}

并且没有任何可用于IDontHaveAccessToSource 的构造函数。它是通过调用另一个类的函数来“创建”的:

IDontHaveAccessToSource obj = loadObject(filename);

【问题讨论】:

  • 你不能。至少没有魔法。
  • 好吧。通过反射和代理,许多事情都成为可能。但仅适用于接口,除非我弄错了。

标签: java inheritance polymorphism


【解决方案1】:

你根本做不到。使用 new Super() 创建的对象不能转为子类对象。如果这可能,您将能够打破良好的面向对象编程的所有规则。

您只能环绕这些对象。例如,想想装饰器或外观模式。

【讨论】:

    【解决方案2】:

    您不能将更通用类的对象转换为更具体的对象,因为内存中没有与子类的特定部分相关的对象数据。 比如说,你有一个类 A,它有一个字段 fA。当您实例化该类的对象时,该字段被初始化并在内存中占据一些位置。现在通过添加字段 fB 将类 A 扩展到 B。您创建一个在内存中分配 fA 和 fB 的对象。

    A aObj = 新 B();是正确的演员,因为 A 知道 aF 并且一旦您访问 fA,它就会在内存中找到该字段;

    B bObj = 新 A();这是因为引用 bF 不会成功(实例化 A 没有在内存中分配 fB)

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 2017-12-27
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多