【问题标题】:Java - Object Type Casting and InheritanceJava - 对象类型转换和继承
【发布时间】: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


【解决方案1】:

如果您正在做很多instanceof 和基于类的条件逻辑,那么您就完全错过了面向对象语言的好处。坚持C。

您应该有一些方法do(),例如,它在ClassA 中是抽象的,但在ClassBClassC 中实现。然后遍历数组并在其中的每个对象上调用do()。多态调用将导致正确的do() 被调用。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        for (ClassA obj : objects) {
            // do something common...
        
            if (obj instanceof ClassC1) {
                ClassC1 c1Obj = (ClassC1) obj;
                c1Obj.MethodFromC1();
            }
        }
        

        【讨论】:

        • 当尝试实现为 foreach 循环时,我收到一条错误消息,指出变量(c10bj 等效项)可能未初始化。我知道对于更原始的类型,解决方案是显式设置变量(int x = 0 等),但我不确定如何处理对象。
        • 对不起。代码中存在错误,现在已修复。您应该键入将obj 变量转换为ClassC1
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 2021-12-27
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多