2015-12-21 92 views
0

我想根據用戶輸入選擇特定的子類,但我不太確定如何執行此操作。例如:根據用戶輸入選擇子類?

System.out.println("Select animal:\n1. Cat\n2. Dog"); 
int input = keyboard.nextInt(); 

if(input == 1){ 
    Cat newPet = new Cat(); 
} 
else{ 
    Dog newPet = new Dog(); 
} 

這只是我剛剛創建的一個快速示例,所以請原諒任何語法錯誤。我明白,一旦if語句結束,newPet對象超出範圍,因此不能再使用。我也嘗試了一些案例,但這是行不通的,因爲我宣稱newPet兩次,儘管在程序的每次運行中只能訪問一個。

根據用戶輸入的不同,程序中更多的不同因素會受到影響。我總是可以在每個不同的因素中使用if語句,但是想知道是否有更乾淨的方法來做到這一點?

回答

2

您可以創建一個界面動物。 貓和狗應該實現動物。 您的代碼可以改成像

System.out.println("Select animal:\n1. Cat\n2. Dog"); 
int input = keyboard.nextInt(); 
Animal pet=null; 
if(input == 1){ 
    pet = new Cat(); 
} 
else{ 
    pet = new Dog(); 
} 

這將有助於保持更簡潔的方法爲好。

+1

另請注意,如果'Cat'和'Dog'不共享一個通用的超類/接口,則可以將'pet'聲明爲Object,但創建一個通用接口更清晰。 –

+0

@Gaël:在這種情況下,它會調用我們需要的任何方法來形式化它,但這種方法可能有效,但它不會更清潔。 –

+0

我寧願在這個場景中使用一個抽象類'Animal',而不是一個接口。 :)但是我知道你的意思,因爲它可能是多態性最常見的例子。 – LordAnomander

0

您可以用所需的子類填充地圖和使用newInstance()方法:

界面動物 {

}

類Cat實現動物 {

}

級狗實施動物 {

}

Map<Integer, Class> animals= new HashMap<Integer, Class>(); 
    animals.put(0, Cat.class); 
    animals.put(1, Dog.class); 

    System.out.println("Select animal:\n1. Cat\n2. Dog"); 
    int input = keyboard.nextInt();  
    Animal yourAnimal = (Animal) animals.get(input).newInstance(); 
0

需要

  • 工廠其中創建寵物實例(在Java中8:Supplier<Pet>
  • 一個輸入值之間的映射和工廠
  • a 策略 what t如果沒有提供有效的輸入,則返回(如果沒有工廠映射爲輸入值,或者返回默認寵物的默認工廠或空值,則可能是引發異常的檢查)。

代碼:

Map<Integer, Supplier<Pet>> factories = new HashMap<>(); 
factories.put(1, Cat::new); 
factories.put(2, Dog::new); 

Supplier<Pet> defaultPetSupplier =() -> null; 
Function<Integer, Pet> f = i -> factories.getOrDefault(i, defaultPetSupplier).get(); 

System.out.println("Select animal:\n1. Cat\n2. Dog"); 
int input = keyboard.nextInt(); 

Pet pet = f.apply(input); 
0

如果你想避免類型轉換,那麼你必須做一點點更多的工作。但是你仍然必須使用多態概念。 創建一個名爲Pet的接口,並將Pet接口中Cat和Dog類所包含的所有方法作爲抽象方法。

class Cat { 
    public void catMethod1() { 
    } 

    public void catMethod2() { 
    } 
} 

class Dog { 
    public void dogMethod() { 
    } 
} 

interface Pet { 
    public void catMethod1(); 

    public void catMethod2(); 

    public void dogMethod(); 
} 

class HelperClass implements Pet { 
    Cat cat; 
    Dog dog; 

    public HelperClass(int input) { 
     if (input == 1) { 
      cat = new Cat(); 
     } else { 
      dog = new Dog(); 
     } 
    } 

    @Override 
    public void dogMethod() { 

     if (dog == null) { 
      return; 
     } 
     dog.dogMethod(); 
    } 

    @Override 
    public void catMethod1() { 
     if (cat == null) { 
      return; 
     } 
     cat.catMethod1(); 

    } 

    @Override 
    public void catMethod2() { 
     if (cat == null) { 
      return; 
     } 
     cat.catMethod2(); 

    } 

} 

現在你可以訪問沒有類型轉換的方法。

Pet newpet = new HelperClass(input);

newpet.catMethod2();

+0

用這種方法,你不必修改你的Dog和Cat類。 –