繁体   English   中英

Java-对象类型转换和继承

[英]Java - Object Type Casting and Inheritance

我有超类A,它由子类B1和B2扩展。 然后,我有五个扩展B1或B2的子类(C1,C2,C3,C4,C5)。

我正在尝试制作一个包含这五个子类之一的数组。

这些对象都实例化为类型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关键字指示object [0]是类A,B1 / B2和C1的实例。

在使我的代码能够识别子类的方法的同时,我该如何维护类对象的数组(循环并执行操作)?

如果您要基于类执行大量的instanceof和条件逻辑,则完全会错过面向对象语言的好处。 只要坚持C。

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

希望能有所帮助。

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

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

    if (obj instanceof ClassC1) {
        ClassC1 c1Obj = (ClassC1) obj;
        c1Obj.MethodFromC1();
    }
}

objects数组中的元素对ClassC1因为只能保证它们是ClassA成员。

例如,如果您有Animal ,类Cat和子类Lion的类层次结构,则尝试调用Animal.maimSafarigoer()方法。 一般而言, Animal对猎杀者一无所知,只有Lion知道如何做。

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

(对不起的类比,很抱歉。:-))

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

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

我列出了大约8种进行变体的次佳方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM