[英]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
中是抽象的,但在ClassB
和ClassC
。 然后,您遍历数组并在其中的每个对象上调用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.