是以下情形可能:OOP繼承問題
- 創建的
Animal
對象池,稱爲AnimalPool
- 從
AnimalPool
- 演員
myAnimal
分配一個Animal
對象(稱爲myAnimal
)到Cat
- 設置
Cat
特定字段 - 商店
myAnimal
成Animal
數組(說在索引0) - 後來訪問陣列,並且投指數0到
Cat
,檢查我在4
是以下情形可能:OOP繼承問題
Animal
對象池,稱爲AnimalPool
AnimalPool
myAnimal
分配一個Animal
對象(稱爲myAnimal
)到Cat
Cat
特定字段myAnimal
成Animal
數組(說在索引0)Cat
,檢查我在4我認爲你可以做你想做的事情,不完全是你想要做的事情。你的AnimalPool本質上將是一個動物「工廠」(查看工廠模式,這可能會有所幫助,但這不是重要的部分),並且作爲「動物」的集合而加倍。製作一個「動物」對象,其中包含所有動物共有的所有方法和屬性。然後製作你需要的動物,如「貓」和「狗」,並從「動物」的基類中派生出來。然後在你的「AnimalPool」中添加函數來創建和返回特定類型的動物,比如getDog()和getCat(),或者使用參數創建一個函數。使用您的AnimalPool工廠創建該特定類型,並且由於它來自「Animal」,您可以將其添加到「Animal」類型的列表中。當您從AnimalPool列表中檢索動物時,您將能夠將它們轉換爲適當的類型。根據你的語言的反射能力,你甚至可以讓對象告訴你它是什麼類型。
這只是使用繼承和工廠模式的簡單情況。看看這兩件事,我想你會在你想要完成的事情上輕鬆過馬路。祝你好運,並希望它有幫助。如果你需要的話,我可以給你一個代碼示例。 :-)
設置在Java中 時在現場2點創建動物則在3,你不能將它轉換爲貓
如果
class Animal {
}
class Cat extends Animal {
private String mewTone;
public void setMewTone(String t){
this.mewTone = t;
}
}
你可以有泳池,配有nimal,但是如果您想投射到Cat並使用setMewTone方法,則給定的對象必須是Cat。你可以檢查它。例如:
Animal animal = objectPool.get();
if(animal instanceof Cat){
Cat castedToCat = (Cat)animal;
castedToCat.setMewTone("horrible");
} else {
System.out.println("This is not a cat.");
}
所以,當你運行這個命令:
ObjectPool<Animal> objectPool = new ObjectPool<Animal>();
objectPool.add(new Animal());
Animal animal = objectPool.get();
((Cat)animal).setMewTone("sth");
你會得到java.lang.ClassCastException: Animal cannot be cast to Cat
爲什麼downvote?如果創建的對象是動物,這聽起來很正確。 –
某人不明白的情況:| – zacheusz
爲什麼你會在第6點第二次投射物體?無論如何,它將是貓的類型,所以不需要那樣做。是的,該領域將被設置。
因爲他正在訪問一個'Animal'類型的數組,而不是'Cat'類型,所以他需要告訴編譯器將它視爲一個'Cat',以便他可以訪問特定於Cat類的字段和方法。 –
只有當該對象創建爲Cat時,該字段纔會被設置。除非你會得到ClassCastException –
是的,我有點使用工廠來產生對象。不過,我希望工廠中的對象池能夠在我產卵時分配任何東西。我想不出一種方法可以在工廠中創建基礎對象池,從中可以分配和返回派生對象 – f20k