申し訳ありませんが、私はJavaを使い始めたばかりの初心者で、この問題に遭遇しました
私は2つのクラスを持っています。
class Dog {
}
class Cat {
}
次に、これら2つのいずれかで満たされた配列を作成しました
Object[][] myAnimal = new Object[4][5];
変数を配列からランダムなオブジェクトに等しく設定したいのですが、それがどのクラスから来たのかわかりません。これを行う方法はありますか?
理想的な解決策は、Animal
抽象メソッドを宣言する独自のスーパークラスを作成することです。たとえば、次のことができます。
abstract class Animal {
public abstract void speak();
}
次にCat
、Dog
それぞれが抽象メソッドの独自の実装を提供します。
class Cat {
public void speak() {
System.out.println("Meow!");
}
}
class Dog {
public void speak() {
System.out.println("Woof!");
}
}
これで、配列を次のように簡単に宣言できます
Animal[][] myAnimal = new Animal[4][5];
いくつかの動物を配列に配置します。
myAnimal[0][0] = new Dog();
myAnimal[0][1] = new Cat();
そして、動物に話すように言います:
myAnimal[0][0].speak();
myAnimal[0][1].speak();
ここでは構文を省略しましmain()
たが、ご自分で組み立てていただければ幸いです。ここで使用される概念は「ポリモーフィズム」と呼ばれます。コードを設計する際に、この重要な OO の概念を使用できるように、よく調べておくことを強くお勧めします。
配列が2つのクラスのいずれかのインスタンスで満たされていると仮定すると、次のようなことができます。
if(myAnimal[x][x] instanceof Dog) //it is an instance of the Dog class
ただし、特に初心者としては、このようなことをするべきではありません。あなたはランダムな犬や猫を選択しようとしていると言いましたか?より良い方法は、犬用と猫用の2つの別々の配列を保持することです。次に、2つの配列からランダムな要素を選択すると、処理しているクラスがわかります。
訪問者パターンは、このような状況で検討するのに非常に良いアプローチです。たとえば、オブジェクト (猫、犬、お金など) ごとに異なる反応が必要なゲームを作成しているとします。だからこれをしてください:
IAnimal
次の定義を持つインターフェイスを作成します。
interface IAnimal {
void visit(IAnimalVisitor visitor, Object param);
}
class Cat implements IAnimal {
void visit(IAnimalVisitor visitor, Object param) {
visitor.visit(this, param);
}
}
class Dog implements IAnimal {
void visit(IAnimalVisitor visitor, Object param) {
visitor.visit(this, param);
}
}
には、定義された動物の種類ごとに 1 つのメソッドがIAnimalVisitor
含まれます。visit()
したがって、次のようになります。
interface IAnimalVisitor {
public void visit(Cat c, Object param);
public void visit(Dog c, Object param);
}
次に、ロジックを使用して、必要に応じて猫と犬を処理できます。例えば:
class AnimalFeeder implements IAnimalVisitor {
public void visit(Cat c, Object param) {
c.feed(milk);
c.feed(cat_food);
}
public void visit(Dog d, Object param) {
d.feed(dog_food);
}
}
次に、上記の食品供給クラスを使用して、次IAnimal
のように配列に供給することができます。
IAnimal[] animals = new IAnimal[] { new Cat(), new Dog(),
new Dog(), new Cat() };
IAnimalVisitor feeder = new AnimalFeeder();
for(IAnimal animal : animals) {
animal.visit(feeder, null);
}
クラス内のあらゆるレベルの階層を自由に扱うことができます。visit()
for each animal クラス タイプを 内に置くだけIAnimalVisitor
です。
そのクラスインスタンスが必要な場合は、リフレクションAPIを使用する必要があると思います。実行時にオブジェクトをチェックする必要があります...あなたの質問は、条件を静的に置きたくないことと、さまざまな異なる条件に対して動的に条件を設定する方法だと思います動物、今日は犬、トラは明日は牛など...だから、リフェルクションAPIを使用してください