有很多方法可以做到這一點,假設你的意思是「創造我的孩子」。
反射
首先是使用反射。如果你有你的類無參數的構造,這是因爲調用Class.newInstance一樣容易:
public Animal breed() {
try {
return (Animal) getClass().newInstance();
} catch (Exception ex) {
// TODO Log me
return null;
}
}
如果你沒有在所有的子類的無參數的構造函數,你必須有一個統一的構造函數遍歷所有的子類。舉例來說,如果你有Cat(int, String)
和Dog(int, String)
,那麼你就需要通過Class.getConstructor
得到構造函數和調用上newInstance
:
return (Animal) getClass().getConstructor(int.class, String.class).newInstance(0, "Unnamed");
int
和String
這裏可能是年齡和名字,例如。這就是你如何用反射來做到這一點。
提供商
另一種方法是使用這個簡單的接口:
public interface Provider<T> {
T create();
}
然後讓你的抽象類採取了這樣的一個實例在其構造:
public abstract class Animal {
private final Provider<Animal> animalProvider;
protected Animal(... , Provider<Animal> animalProvider) {
// ...
this.animalProvider = animalProvider;
}
public Animal breed() {
return animalProvider.create();
}
}
然後你子類會將Provider<Animal>
傳遞給超類,它將創建子類的新實例:
public class Dog extends Animal {
public Dog(...) {
super(... , new DogProvider());
// ...
}
private static class DogProvider implements Provider<Animal> {
public Animal create() {
return new Dog(...);
}
}
}
對其他子類也做同樣的事情。
注意:如果通過breed
您的意思是「得到我的類型」,那麼你應該編輯你的問題說出來。如果這是你的意思,那麼這是一個可行的解決方案:
public abstract class Animal {
protected final Breed breed;
protected Animal(... , Breed breed) {
// ...
this.breed = breed;
}
public Breed getBreed() {
return breed;
}
}
我建議您按照get
/set
約定數據容器的方法。 Java擁有旨在處理這些命名約定的bean類,它在很多平臺上或多或少都是標準。爲了您的子類:
public class Dog extends Animal {
public Dog(...) {
super(... , new Breed(...));
// ...
}
}
是的,它是沒有必要的,在一個類中的所有方法都需要是抽象 –
@SashiKant雖然如此,我不認爲這是OP是問什麼...... –