【发布时间】:2013-10-16 04:38:23
【问题描述】:
我有超类 A,它由子类 B1 和 B2 扩展。然后,我有五个子类(C1、C2、C3、C4、C5)扩展了 B1 或 B2。
我正在尝试创建一个包含这五个子类中的每一个的数组。
这些对象都被实例化为类型 A 的实例。
ClassA[] objects = new ClassA[5];
我尝试将每个对象重新分配给其中一个子类:
objects[0] = new ClassC1;
objects[1] = new ClassC2; // etc...
此时,A 类中存在的任何方法都可以正常工作,但找不到 B1/B2 或其他子类中定义的方法:
objects[0].MethodFromC1(); // returns a "symbol not found" error
instanceof 关键字表示 objects[0] 是 A、B1/B2 和 C1 类的实例。
我可以做些什么来维护我的类对象数组(循环并执行操作),同时让我的代码识别子类的方法?
【问题讨论】:
-
在
ClassA中创建一个可由子类实现/覆盖的通用(或抽象)方法是否可行?这样,您不必担心哪个对象属于哪个具体类型,您只需调用您的泛型doSomething方法,各个对象的行为就会适合其类型。 -
正如@Teeg 所说,您需要一个抽象基类,并在派生类中覆盖所需的方法。
-
你希望能够创建异构容器,避免Java的强类型,但你只需要考虑多态。我发现自己编写更多 Ruby 的原因和其他原因(scala、clojure、任何 lisp 变体都足够了)。
-
你所说的会起作用,但我试图在子类中没有任何未使用的方法。我的 A 类中有一些抽象方法,但 B1/B2 类中的方法更具体,不适用于所有子类。
标签: java oop object inheritance casting