数组的两个不同的子类

时间:2016-11-03 21:02:47

标签: java class

我有两个超类

的子类
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;

怎么可能?我会以正确的方式前进吗?

4 个答案:

答案 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;

您可以轻松地将此方法概括为适用于大量BC个对象。因此,您可以拥有变量bc,而不仅仅是变量AA 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类的对象,并可以相应地设置或获取值。

希望这有帮助。