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

你做事的方式没有错。您还可以查看工厂设计模式

于 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 回答
1
    switch (x){
      case 1: 
       animal = new Dog();
       break;
      case 2:
       animal = new Cat();
       break;
      default
       animal = new Cow();
    }

你确定这Cow是一个有用的默认值吗?

于 2013-01-02T17:25:18.347 回答
0

我更喜欢动物阵列

IAnimal animal = null;

IAnimal [] animals ={null,new Dog(),new Cat(),new Cow()};

animal = animals[x]
于 2013-01-02T17:25:07.843 回答