我有两个超类
的子类public class A {
}
public class B extends A{
int weight;
}
public class C extends A{
int height;
}
现在,我需要一个名为myArray的数组,其中一些单元格来自B类,其他单元格来自C类。
A[10] myArray;
myArray[2]=new B();
myArray[3]=new C();
myArray[2].weight=40;
myArray[3].height=60;
怎么可能?我会以正确的方式前进吗?
答案 0 :(得分:1)
可以将从A
继承的所有对象放入同一个数组中,但是要使用特定于对象的字段,您必须在放入数组之前解析为转换或设置字段。我更喜欢后来的
A myArray[10];
B b = new B();
C c = new C();
b.weight=40;
c.height=60;
myArray[2] = b;
myArray[3] = c;
您可以轻松地将此方法概括为适用于大量B
和C
个对象。因此,您可以拥有变量b
和c
,而不仅仅是变量A
和A myArray[10];
myArray[2] = new B();
myArray[3] = new C();
((B)myArray[2]).weight=40;
((C)myArray[3]).height=60;
。然后,当您完成设置其值后,您可以将它们全部放在ClassCastException
。
为了完整起见,这里是铸造方法(注意多少丑陋)
{{1}}
另请注意,如果在运行时将其强制转换为错误类型,则会出现令人讨厌的{{1}}异常
答案 1 :(得分:0)
你描述的是duck typing。实际上,这可以通过反射在Java中实现。
myArray[2].getClass().getDeclaredField("weight").setInt(myArray[2], 40);
但这不是一个很好的方法。
您应该只是转换对象,然后访问属性:
((B)myArray[2]).weight = 40;
Groovy是JVM的语言,它默认使用duck typing,所以你在Groovy中实际上可以编写:
myArray[2].weight = 40;
答案 2 :(得分:0)
我会这样:定义一个可以用抽象方式设置w或h的接口......
interface IGiveContent {
void takeInt(int someInt);
}
abstract class A implements IGiveContent {
}
class B extends A {
private int weight;
@Override
public void takeInt(int someInt) {
weight = someInt;
}
}
class C extends A {
private int height;
@Override
public void takeInt(int someInt) {
height = someInt;
}
}
public class Test {
public static void main(String[] args) {
IGiveContent[] foo = new IGiveContent[4];
foo[0] = new B();
foo[1] = new C();
foo[2] = new B();
foo[3] = new C();
//
foo[0].takeInt(111);
foo[1].takeInt(222222);
foo[2].takeInt(33332);
}
}
答案 3 :(得分:0)
如果我理解正确,以下是您要做的事情 1)你有一个父类,它将拥有共同的实体。 2)儿童班将为该特定儿童举办特定实体 3)您想要访问子对象和父对象。
如果以上是正确的,那么您可以使用您提到的实施,只需进行一些更改。我会做类似下面的事情:(伪代码)
Class A{
//Common entities and getter/setters
String firstName;
String lastName;
}
Class B extends A{
Float height;
//Getter/ setter
}
Class C extends A{
Float weight:
//Getter/setter
}
您可以创建B类或C类的对象,并可以相应地设置或获取值。
希望这有帮助。