2016-04-26 6 views
3

私はFoodというクラスを持っていて、コンストラクタには価格、カロリー、説明の属性があります。Javaのスーパークラス参照を介してサブクラスオブジェクトのプロパティにアクセスできますか?

私はまた、Burgerと呼ばれるFoodのサブクラスを持っています.Burgerには、肉の種類の追加属性があります。

ここで、Burgerクラスのインスタンスを含むフードインスタンスの配列を作成すると、配列を通じて肉型の属性にアクセスできますか?

これは混乱しますが、親オブジェクトと子オブジェクトの配列の親と子のプロパティにアクセスできるかどうかを知りたいと思います。私もJavaを使用しています。

+0

((バーガー)フーズ[インデックス])。getMeatType –

+0

コンストラクタにはプロパティがありません。オブジェクトインスタンスのみがプロパティを持ちます。あなたの質問は、 "スーパークラスの参照を介してサブクラスオブジェクトのプロパティにアクセスできますか?" –

+0

甘い、ありがとう。正確に何が起きているのか説明しようと思いますか? FoodインスタンスはBurgerインスタンスにキャストされていますか? ご清聴ありがとうございます。したがって、コンストラクタには属性があり、オブジェクトにはプロパティがありますか? – Skistar002

答えて

2

Foodの配列に格納されていても、Burgerのプロパティにアクセスできます。最初に、それをBurgerにキャストする必要がありますので、あなたのプログラムはそれがどのタイプであるかを知っています。 Foodの配列内のすべてのオブジェクトがBurgerであるわけではないので、最初に型をチェックすることをお勧めします。このような何か:あなたのケースでは

Food[] myFoods; //your food array 
if (Burger.isInstance(myFoods[0])) { //check that the Food is a Burger 
((Burger)myFoods[0]).meatType; //cast the object to a Burger and access its property 
} 
+0

ありがとうございます!それは多くの意味があります。私が今持っている方法は、私は2つの別々の配列を持っているが、今はオブジェクトの配列を1つしか持てないということです。 – Skistar002

+0

@ Skistar002助けて嬉しいです!これがあなたの問題を解決したなら、私はアップヴォートまたは受け入れを本当に感謝します。 – nhouser9

1

、サブクラスBurger年代meat属性は、そのサブクラスに固有なので、唯一のオプションは、あなたがそのバーガーにアクセスする時に、BurgerFoodオブジェクトをダウンキャストすることです特有の特性。これは、キャストが失敗する可能性があるため、コレクション(配列)に異なるサブクラスが含まれている場合に問題が発生します。

Food[] foods = new Food[n]; 
Food[0] = new Burger(...); 
Food[1] = new Vegetable(...); 
Meat m1 = ((Burger)foods[0]).getMeat(); // This is OK 
Meat m2 = ((Burger)foods[1]).getMeat(); // ClassCastException 

またはそれ以上

for (Food f : foods) 
{ 
    if (f instanceof Burger) 
    { 
     Meat m = ((Burger)foods[0]).getMeat(); 
     // other Burger-related processing 
    } 
    else if (f instanceof ...someothersubclass) 
    { 
     ... 

これはかなり脆くなる傾向があるが、あなたはここで物事を合理化するために多型を使用することはできません。ランタイム(動的)ディスパッチは、オーバーライドされたメソッドに対してのみ機能します。同じクラスのオーバーロードされたメソッドはコンパイル時に解決されます。

関連する問題