、サブクラスBurger
年代meat
属性は、そのサブクラスに固有なので、唯一のオプションは、あなたがそのバーガーにアクセスする時に、Burger
にFood
オブジェクトをダウンキャストすることです特有の特性。これは、キャストが失敗する可能性があるため、コレクション(配列)に異なるサブクラスが含まれている場合に問題が発生します。
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)
{
...
これはかなり脆くなる傾向があるが、あなたはここで物事を合理化するために多型を使用することはできません。ランタイム(動的)ディスパッチは、オーバーライドされたメソッドに対してのみ機能します。同じクラスのオーバーロードされたメソッドはコンパイル時に解決されます。
((バーガー)フーズ[インデックス])。getMeatType –
コンストラクタにはプロパティがありません。オブジェクトインスタンスのみがプロパティを持ちます。あなたの質問は、 "スーパークラスの参照を介してサブクラスオブジェクトのプロパティにアクセスできますか?" –
甘い、ありがとう。正確に何が起きているのか説明しようと思いますか? FoodインスタンスはBurgerインスタンスにキャストされていますか? ご清聴ありがとうございます。したがって、コンストラクタには属性があり、オブジェクトにはプロパティがありますか? – Skistar002