2014-03-29 60 views
0

我有這樣的代碼:Java的從列表中調用子類

public abstract class animal { 
public final static int elephent = 1; 
public final static int dog = 2; 

和兩個子類:

public class elephant extends animal { 

    public final static int type = animal.elephent; 

    public elephant (String name){ 
     super(name); 
    } 

} 

public class dog extends animal { 

    public final static int type = animal.dog; 

    public dog (String name){ 
     super(name); 
    } 

} 

現在,說我有個字符的以字母E中的列表 - 大象和D-狗。 和一個相同大小的動物類的空列表。 和第一個列表上的每個字符我想創建一個新的動物實例。 例如:[「d」,「e」,「d」] 會給我一個清單:[新狗,新大象,新狗] 希望我自己清楚, 提前感謝您的幫助。

+0

這個家庭工作你的嘗試是什麼? – vels4j

回答

1

所以你可能要考慮的事情之一是switch-case聲明。因此,在Java中,你可以做這樣的事情:

// get a char from the list. 
char animal; 

switch(animal) 
{ 
    case'e': 
     Elephant varName = new Elephant("Dumbo"); 
     newList.add(varName); 
     break; 
} 

我不包括在這裏的一切,但這應該讓你開始。你將需要通過數據結構來查找迭代(循環)。

我會誠實的說,自從我寫了Java以來​​已經有一段時間了,但這是一種可以做到這一點的方法。還有其他方法可以做到這一點,例如使用if塊。

希望這會有所幫助。

+0

謝謝,但是我知道該怎麼做。 – user3150902

+0

即時通訊尋找一種方法來創建一個使用超類動物索引的新實例。 – user3150902

2

這種設計不是最優的。你用一個整型變量表示類型,這真的不是一個好主意。

第一次改進:使類型指示爲枚舉。

public enum AnimalType { 
    ELEPHANT, DOG 
} 

現在,在你的動物類添加一個類型字段:

public abstract class Animal { 
    private final AnimalType type; 
    private final String name; 
    protected Animal(AnimalType type, String name) { 
     this.type = Objects.requireNonNull(type); 
     this.name = Objects.requireNonNull(name); 
    } 
    // more fields and methods here 
} 

然後大象看起來像(狗是相似的):

public class Elephant extends Animal { 
    public Elephant(String name) { 
     super(AnimalType.ELEPHANT, name); 
    } 
    // more fields and methods here 
} 

主要缺點:每次你添加一個新的動物類型,您必須添加一個新類向枚舉中添加一個類型。這不是最好的設計。此外,類型枚舉並不是真的需要,因爲子類型已經包含類型信息

Elephant的一個實例是一頭大象(狗一樣)。它不需要類型字段。

二,改進:完全刪除類型指示。沒有整數,沒有枚舉。只需要抽象類和子類。

現在你的問題,如何從任何字符輸入得到正確的實例。這被稱爲映射。你想要映射

字符'E'到類Elephant

字符'D'到類Dog

這可以通過一個Java Map來實現:

Map<Character, Class<? extends Animal>> charToAnimal = new HashMap<>(); 
charToAnimal.put('E', Elephant.class); 
charToAnimal.put('D', Dog.class); 

Class<? extends Animal> animalClass = charToAnimal.get('E'); 
String name = ...; 
Animal animal = animalClass.getConstructor(String.class).newInstance(name); // will be an Elephant instance 

此圖應該在任何類保持你需要的行爲,或可能在main方法,如果你剛開始學習如何做到這一點。

請注意,我使用了一種名爲reflection的Java機制,只是爲了創建一個實例,因爲沒有其他通用的方式來處理實例。

另一種方法是,做同樣的方法:

public Animal createAnimal(char c, String name) { 
    if (c == 'E') { 
     return new Elephant(name); 
    } else if (c == 'D') { 
     return new Dog(name); 
    } else { 
     throw new IllegalArgumentException(c); 
    } 
} 

無論哪種方式,你必須添加不僅NE動物子類,但你必須一個條目添加到地圖上(見上)或方法的if分支。


編輯,因爲我再次考慮過這種情況。

你可以使用枚舉方法並將類實例化放入此枚舉中。以動物類如上面和下面的枚舉類型(未選中):

public enum AnimalType { 
    ELEPHANT('E', Elephant.class), 
    DOG('D', Dog.class); 

    private static final Map<Character, Class<? extends Animal>> CHAR_TO_ANIMAL = new HashMap<>(); 
    AnimalType(char c, Class<? extends Animal> animalClass) { 
     CHAR_TO_ANIMAL.put(c, animalClass) 
    } 
    public Animal createAnimal(char c, String name) { 
     if (c == 'E') { 
      return new Elephant(name); 
     } else if (c == 'D') { 
      return new Dog(name); 
     } else { 
      throw new IllegalArgumentException(c); 
     } 
    } 
} 
0

我想什麼ü需要的是一個靜態的工廠方法返回一個instance.Here是這樣做的一種方式。

抽象類:

public abstract class animal { 
public final static char elephent = 'E'; 
public final static char dog = 'D'; 
} 

大象類:

public class Elephant extends Animal { 

    private char myType; 
    private String name; 

    public Elephant(char type, String name) { 
     super(); 
     this.myType = type; 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public char getMyType() { 
     return myType; 
    } 

    public void setMyType(char myType) { 
     this.myType = myType; 
    } 

} 

狗類:

public class Dog extends Animal { 

    private char myType; 
    private String name; 

    public Dog(char type, String name) { 
     super(); 
     this.myType = type; 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public char getMyType() { 
     return myType; 
    } 

    public void setMyType(char myType) { 
     this.myType = myType; 
    } 

} 

工廠類:

public class FactoryMethod { 

    static char getAnimalIndex(char type){ 

     switch (type) { 
     case 'E': 
     case 'e': 
      return Animal.ELEPHANT; 
     case 'D': 
     case 'd': 
      return Animal.DOG; 
     default: 
      throw new IllegalArgumentException(String.valueOf(type)); 
     } 
    } 

    public static Animal getInstance(char type, String name){ 
     Animal myCategory = null; 
     switch (getAnimalIndex(type)) { 
     case Animal.ELEPHANT: 
      myCategory = new Elephant(type,name); 
      break; 
     case Animal.DOG: 
      myCategory = new Dog(type,name); 
      break; 
     } 
     return myCategory; 
    } 

} 

用法:

如果您需要使用動物類索引或作爲與該工廠方法工作的列表中的字符。 獲得實例:

//using Animal index 
FactoryMethod.getInstance(Animal.ELEPHANT,"Elephant"); 
FactoryMethod.getInstance(Animal.DOG,"Dog"); 

//using characters in list 
FactoryMethod.getInstance('character_in_list_here',"Name OF The Animal Here"); 

既然是ü沒有使用FactoryMethod實例可以使用一個靜態方法。 我希望這是你需要的。