2011-07-10 191 views
0

是以下情形可能:OOP繼承問題

  1. 創建的Animal對象池,稱爲AnimalPool
  2. AnimalPool
  3. 演員myAnimal分配一個Animal對象(稱爲myAnimal)到Cat
  4. 設置Cat特定字段
  5. 商店myAnimalAnimal數組(說在索引0)
  6. 後來訪問陣列,並且投指數0到Cat,檢查我在4

回答

2

我認爲你可以做你想做的事情,不完全是你想要做的事情。你的AnimalPool本質上將是一個動物「工廠」(查看工廠模式,這可能會有所幫助,但這不是重要的部分),並且作爲「動物」的集合而加倍。製作一個「動物」對象,其中包含所有動物共有的所有方法和屬性。然後製作你需要的動物,如「貓」和「狗」,並從「動物」的基類中派生出來。然後在你的「AnimalPool」中添加函數來創建和返回特定類型的動物,比如getDog()和getCat(),或者使用參數創建一個函數。使用您的AnimalPool工廠創建該特定類型,並且由於它來自「Animal」,您可以將其添加到「Animal」類型的列表中。當您從AnimalPool列表中檢索動物時,您將能夠將它們轉換爲適當的類型。根據你的語言的反射能力,你甚至可以讓對象告訴你它是什麼類型。

這只是使用繼承和工廠模式的簡單情況。看看這兩件事,我想你會在你想要完成的事情上輕鬆過馬路。祝你好運,並希望它有幫助。如果你需要的話,我可以給你一個代碼示例。 :-)

+1

是的,我有點使用工廠來產生對象。不過,我希望工廠中的對象池能夠在我產卵時分配任何東西。我想不出一種方法可以在工廠中創建基礎對象池,從中可以分配和返回派生對象 – f20k

2

設置在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

  • 另一件事是,這是可能的另一種面向對象的語言(與動態類型)
  • 考慮在這種情況下使用另一種模式
+3

爲什麼downvote?如果創建的對象是動物,這聽起來很正確。 –

+0

某人不明白的情況:| – zacheusz

1

爲什麼你會在第6點第二次投射物體?無論如何,它將是貓的類型,所以不需要那樣做。是的,該領域將被設置。

+1

因爲他正在訪問一個'Animal'類型的數組,而不是'Cat'類型,所以他需要告訴編譯器將它視爲一個'Cat',以便他可以訪問特定於Cat類的字段和方法。 –

+1

只有當該對象創建爲Cat時,該字段纔會被設置。除非你會得到ClassCastException –