2016-11-03 58 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