2

Java で指向オブジェクトの概念を理解するために、単純な Zoo アプリケーションを作成しています。

私のモデルは次のとおりです: 1) 動物園には多数のケージがあります 2) ケージにはネコ、霊長類、または鳥が混在しています 3) 動物は食べたり、寝たり、飲んだりできます 4) ネコは動物を拡張します (余分なネコのことをします) 5 ) 霊長類は動物を拡張します (霊長類の追加機能を実行します) 6) 鳥は動物を拡張します (追加の鳥機能を実行します)

問題:

動物園で x 個のケージ (Cage の ArrayList) を処理するのは非常に簡単ですが、私は Cage 内の動物に苦労しています。Object の ArrayList が必要であることがわかりました。

これまでのところは順調ですが、動物を取り戻してポストを引っ掻いてもらうと、それはもう猫ではなく、オブジェクトです。

public class Cage{

        private String name;
        private ArrayList<Object> animals = new ArrayList<Object>();

        public Cage(String name){
            this.name = name;
        }

        public void addFeline(String name){
            Feline newFeline= new Feline(name);
            this.animals.add(newFeline);
        }

        public void addPrimate(String name){
            Primate newPrimate= new Primate(name);
            this.animals.add(newPrimate);
        }

        public void addBird(String name){
            Bird newBird= new Bird(name);
            this.animals.add(newBird);
        }

        public void removeAnimal(int index){
            this.animals.remove(index);
        }

        public Object getAnimal(int index){
            Object myAnimal = this.animals.get(index);
            return myAnimal;
        }
    }

そして、私がそれを呼ぶ方法:

Zoo myZoo = new Zoo("My Zoo");
myZoo.addCage("Monkey Exhibit");
Cage myCage = myZoo.getCage(0);
myCage.addFeline("Leo");
Object MyAnimal = myCage.getAnimal(0);

質問: オブジェクトをクラス Feline のインスタンスに戻して、Post をスクラッチできるようにするにはどうすればよいですか?

4

4 に答える 4

3

この問題にアプローチする最善の方法は、Strategy デザイン パターンを使用することだと思います。

Feline、Primate、および Bird は、インターフェイス Animal を実装する必要があります。Cage には public void addAnimal(Animal animal); メソッドがあります。

ネコ科、霊長類、鳥類のオブジェクトの作成はケージの外で行う必要があります。

これが役立つ場合は、いくつかのコードをまとめました。以下のようなアプリケーションを設計します。

動作は、インターフェイスを使用してカプセル化する必要があります。例: 食べる行動

public interface Animal {
    public String getName();
}
public interface EatingBehaviour {
    public void howManyTimes();
}

public class RealLionEatingBehaviour implements EatingBehaviour{
    @Override
    public void howManyTimes() {
        System.out.println("I eat once a day");
    }
}

public class ToyLionEatingBehaviour implements EatingBehaviour {
    @Override
    public void howManyTimes() {
        System.out.println("I never eat! I am a toy lion.");
    }
}

public abstract class Feline implements Animal{
    public abstract void scratchPost();
    private EatingBehaviour eatingBehaviour;
    public EatingBehaviour getEatingBehaviour() {
        return eatingBehaviour;
    }
    public void setEatingBehaviour(EatingBehaviour eatingBehaviour) {
        this.eatingBehaviour = eatingBehaviour;
    }
}

public class Lion extends Feline {
    private String name;
    public String getName() {
        return this.name; 
    }
    public void setName(String name) {
        this.name = name; 
    }
    Lion (String name) {
        this.name=name;
    }
    public void scratchPost(){
        System.out.println(getName() + " Lion Scratching Post!");
    }   
}

public class AnimalFactory {
    public static Animal getAnimalInstance(String type, String name){
        Animal animal=null;
        if ("lion".equalsIgnoreCase(type)) {
            animal = new Lion(name);
        }
        return animal;
    }
}

import java.util.ArrayList;
import java.util.List;

public class Cage {
    private List<Animal> animals = new ArrayList<Animal>();
    public void addAnimal(Animal animal) {
        animals.add(animal);
    }
    public void removeAnimal(int index){
        this.animals.remove(index);
    }
    public Animal getAnimal(int index){
        return this.animals.get(index);
    }   
}

public class Zoo {
    public static void main(String args[]) {
        Cage cage = new Cage();
        Animal animal = null;
        animal = AnimalFactory.getAnimalInstance("Lion", "Sweety");
        cage.addAnimal(animal);
        Animal animalFromCage = cage.getAnimal(0);
        if (animalFromCage instanceof Feline) {
            Feline feline = (Feline) animalFromCage;
            feline.setEatingBehaviour(new RealLionEatingBehaviour());
            feline.scratchPost();
            feline.getEatingBehaviour().howManyTimes();
            feline.setEatingBehaviour(new ToyLionEatingBehaviour());
            feline.getEatingBehaviour().howManyTimes();
        }
    }
} 
于 2013-08-04T23:40:45.470 に答える
2

キャストを使用します。

Object myAnimal = myCage.getAnimal(0);
Feline f = (Feline) myAnimal;
于 2013-08-04T23:25:30.963 に答える
0
private List<Animal> animals = new ArrayList<Animal>();
    public void findAnimal(int index) {
        Animal myAnimal = animals.get(index);
        if (myAnimal instanceof Feline) {
            Feline feline = (Feline) myAnimal;
            //do the work with Feline
        } else if (myAnimal instanceof Primate) {
            //do the work with Primate
        }
        // continue with the other types.
    }

これにより、予期しないクラスキャスト例外が回避されます。タイプがわかっているので、オブジェクトの代わりに Arraylist でスーパー タイプ (Animal) を使用します。オブジェクトの場合は、リストに何でも追加できます。

于 2013-08-04T23:47:36.497 に答える
-1

ArrayList<? extends Animal>の代わりに を使用する必要がありArrayList<Object>ます。次に、戻り値を の適切なサブクラスにキャストしますAnimal

于 2013-08-04T23:26:34.960 に答える