は、これらのクラスを持つ:スーパークラスオブジェクトの配列。それらをサブクラスとして管理する方法は?
public abstract class Furniture
public class Chair : Furniture
public class Table : Furniture
public class Kitchen
{
ArrayList <Furniture> furnitures;
//other code
public void function()
{
Furniture furniture = furnitures.get();
doSomethingInKitchen(furniture);
}
private void doSomethingInKitchen (Chair c);
private void doSomethingInKitchen (Table t);
}
私は私がサブクラス1(椅子やテーブル)としてスーパークラスの家具のオブジェクトを操作するには保証のベストプラクティスを探しています。
私は単純なキャストで試してみましたが、私が関数を呼び出すと、テーブルやチェアのものではなく、家具オブジェクトで動作します。
私が試したことのようなものです:問題はcurrentFurnitureが
Furniture currentFurniture;
として宣言され、それが議長として認識されないことがあるかどうかは知りません
for each Furniture in Array List
if(furniture.get() istance of Table)
{
currentFurniture = (Table) furniture.get();
}
else if (furniture.get() istanceof Chair)
{
currentFurniture = (Chair) furniture.get();
}
doSomethingInKitchen(currentFurniture)
キャスティングにもかかわらず、またはソリューションのデザイン自体が間違っている場合は、テーブル。
**多型は**メソッドが呼び出されるオブジェクトのタイプに基づいて動作します。メソッドの引数の型ではありません。 'furniture.doSomethingInTheKitchen()'でなければなりません。麻生は、Javaでエラーを尋ねるときに、疑似コードではなく、実際のJavaコードを投稿します。 –
JBNizetが述べたことをちょっと補足してください:あなたの例では、あなたのオブジェクトを "使う"と仮定します。このようにして、 '(Kitchen Object).furniture.get()。use();'このようにして、コードが存在するかどうか心配することなく、上級クラスと下位クラスをコーディングすることができます。 – Bonatti