2

インターフェイスの実装されたクラスを初期化する適切な方法は何ですか (いくつかのロジックによって決定されます)

IAnaimal is an interface
Cat -> IAnimal
Dog -> IAnimal
Cow -> IAnimal


int x = in.nextInt();
IAnimal animal = null;

if(x==1)
 animal = new Dog();
else if(x==2)
 animal = new Cat();
else
 animal = new Cow();

animal.destroyManKind();

これは正しいアプローチですか?これを行うための「より」専門的な方法はありますか?

4

5 に答える 5

4

1、2、3 の代わりに名前を読みやすくする方法がありますが、この場合はスイッチを使用できます。

int choice = in.nextInt();

switch(choice) {
  case 1: animal = new Dog(); break;
  case 2: animal = new Cat(); break;
  default: animal = new Cow(); break;
}

または文字列スイッチを使用して

String choice = in.next();

switch(choice.toLowerCase()) {
  case "dog": animal = new Dog(); break;
  case "cat": animal = new Cat(); break;
  case "cow": animal = new Cow(); break;
  default: // error
}
于 2013-01-02T17:23:39.223 に答える
3

あなたのやり方に間違いはありません。Factory design patternも参照できます。

于 2013-01-02T17:23:02.263 に答える
1

それらが共通のスーパークラス Animal を持っていると仮定すると、int を取る静的ビルダー メソッドを持っている可能性があり、これを行うことができます

IAnimal animal = Animal.build(x);

どこ

public class Animal{
public static IAnimal build(int x){

 if(x==1) return new Dog();
 else if(x==2) return new Cat();

 return new Cow();
}}
于 2013-01-02T17:22:53.233 に答える