2016-11-03 56 views
0

我有两个亚类从一个超类阵列的两个不同的亚类

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

它编译? – smac89

+0

'A'没有名为'weight'或'height'的成员,所以他们不能设置。编译器知道的关于'myArray'的唯一事情就是其中的所有内容都扩展了'A'。而已。你可以这样做:'((B)myArray [2]).weight = 40',因为编译器可以在运行时确定'myArray [2]'也是'B',但是必须是cast。 – Tibrogargan

+0

如果你投B和C到A它应该工作。 – redxef

回答

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,你可以有一个数组;那么当你完成设置它们的值时,你可以将它们全部放入A的数组中。

为了完整起见,这里是铸造方法(注意有多少丑陋)

A myArray[10]; 

myArray[2] = new B(); 
myArray[3] = new C(); 

((B)myArray[2]).weight=40; 
((C)myArray[3]).height=60; 

还要注意的是,如果你在运行时将它转换为错误的类型,你讨厌的ClassCastException例外

+0

是的,这绝对是我需要的。谢谢。 –

0

你描述的是duck typing。这实际上可以在Java中使用反射来实现。

myArray[2].getClass().getDeclaredField("weight").setInt(myArray[2], 40); 

但这不是很好的方法。

你还是只投对象,然后访问属性:

((B)myArray[2]).weight = 40; 

Groovy是语言的JVM它默认使用鸭打字,让你在Groovy中你可能会居然能写:

myArray[2].weight = 40; 
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); 

    } 

} 
+0

我没有相同的方法来重载它们! –

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类对象,并可以相应地设置或获取值。

希望这会有所帮助。

+0

保持冷静!并阅读这个问题! –

+0

@Omi“如果我理解正确,” - – user7005835