0

我有超类 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 的实例。

我可以做些什么来维护我的类对象数组(循环并执行操作),同时让我的代码识别子类的方法?

4

4 回答 4

3

If you are doing a lot of instanceof and conditional logic based on class, you are completely missing out on the benefits of an object-oriented language. Just stick to C.

You should have some method do(), for example, that is abstract in ClassA but implemented in ClassB and ClassC. Then you iterate over the array and call do() on every object in there. The polymorphic call will result in the right do()'s being called.

Hope that helps.

于 2013-10-09T01:49:01.430 回答
1

您可以在 if 语句中使用 instanceof 关键字并将对象转换为所需的类型。例如,

for (ClassA obj : objects) {
    // do something common...

    if (obj instanceof ClassC1) {
        ClassC1 c1Obj = (ClassC1) obj;
        c1Obj.MethodFromC1();
    }
}
于 2013-10-09T01:41:20.233 回答
1

数组中的元素objects一无所知,ClassC1因为它们只保证是ClassA.

例如,如果您有一个Animal和子类Cat及其子类的类层次结构Lion,则您正在尝试调用该Animal.maimSafarigoer()方法。Animal一般来说,s 对 safarigoers 一无所知,只有Lions 知道如何去做。

使用instanceof运算符来检查您是否正在对特定子类型进行操作。

(对不起这个可怕的类比。:-))

于 2013-10-09T01:41:26.900 回答
1

您正在尝试在 Java 中实现变体。长期以来,这个主题一直是我最讨厌这种语言的事情之一。

http://jazzjuice.blogspot.com/2010/10/6-things-i-hate-about-java-or-scala-is.html

我已经列出了大约 8 种次优方法来做变体。

于 2013-10-09T01:46:00.560 回答