2011-12-08 25 views
0

獲取字符串想象我有這樣的:從Java子

public class Animal { 
    private String racaAnimal; 
    private String corAnimal; 

    public String getCorAnimal() { 
     return this.corAnimal; 
    } 

    public String getRacaAnimal() { 
     return this.racaAnimal; 
    } 

      public Animal getAnimaisCliente(int indice) { 
        return this.animaisCliente[indice]; 
      } 
} 

public class Estimacao extends Animal{ 
    private String nomeAnimal; 

    public String getNomeAnimal() { 
     return nomeAnimal; 
    } 
} 

public class Cliente{ 
    private Animal[] animaisCliente; 
} 

構造函數沒有顯示,但他們工作的罰款。

我已經包含所有Cliente

ArrayList<Cliente> clientes = new ArrayList<Cliente>(); 

而一個動物一個ArrayList的是這樣

Estimacao animaisEstimacao = new Estimacao(nomeAnimal,racaAnimal,corAnimal); 

然後將其添加到動物的陣列中Cliente

現在,如果創建我這樣做:

System.out.println(" Raça: " + clientes.get(0).getAnimaisCliente(0).getRacaAnimal()); 

它的工作原理。 但是我怎麼能從類Estimacao得到nomeAnimal?

如果我把

System.out.println(" Nome: " + clientes.get(0).getAnimaisCliente(0).getNomeAnimal()); 

它不工作。

從一個子類中,我們可以從超類中得到東西,但是另一種方式卻是這樣?可能嗎?

+0

我不完全理解這個問題,但我猜測抽象方法會符合要求。 – emory

回答

2

嘗試

System.out.println(" Nome: " + ((Estimacao) clientes.get(0).getAnimaisCliente(0)).getNomeAnimal()); 
+0

謝謝,但只有一個問題。 ((Estimacao)clientes.get(0).getAnimaisCliente(0))它如何將動物投射到Estimacao? – Favolas

+0

是的,這意味着一隻動物不是Estimacao,它會失敗(ClassCastException) - 在使用一個Instance of – Guillaume

+0

'Estimacao extends Animal'進行投射之前,您應該確實檢查它,這樣您可以將'Animal'降級爲'Estimacao'。不知道我有你的問題 – korifey

5

你需要投你AnimalEstimacao。但很明顯,如果你不想冒險異常,請確保您的Animal是正確的類前:

Animal animal = clientes.get(0).getAnimaisCliente(0); 
if (animal instanceof Estimacao) { 
    System.out.println(" Nome: " + ((Estimacao) animal).getNomeAnimal()); 
} 
+0

太好了。現在我知道一種方法來控制這種可能的異常 – Favolas

0

AnimalEstimacao訪問Estimacao

0

定義的方法它是不可能的,因爲你在問。但是,你可以在你的基類(Animal)添加getNomeAnimal(),這將返回null或空字符串 - 然後是Estimacao類的實例將返回正確的值。

0

這是你的動物類misplaces用法:

this.animaisCliente[indice] // animaisCliente is not an attribute of Animal 
3

認爲它是這樣的:一個子類的實例也是其父的一個實例。但超類的一個實例不一定是子類的一個實例。因此,超類方法總是可用的,但子類方法只能在子類中使用。

如果你確信你有子類的實例,你可以明確地投它並調用特定的子類,方法就可以了,但是你需要照顧這樣做。

0

沒有,除非你施放的動物類型對象Estimacao類型,你不能做到這一點。只有在演員結束後,getNomeAnimal()纔會提供給你。但這是一件壞事。如果你的數組包含動物類型和Estimacao類型對象的混合,那麼它將失敗並出現ClassCastException。

+0

當你知道自己在做什麼時,這並不一定是壞事,但是在投射之前你一定要檢查一下。無論如何,通常不得不施放表明一個糟糕的設計,所以可能有必要完全重新審視它 – Guillaume

+0

我完全同意。但是,如果您確定知道數組中不會有其他子類型對象,則可以使用一組Estimacao對象而不是Animal。但是,我同意當前的實施需要完全訪問。 – Drona

+0

當我說「當你知道你在做什麼」時,我的意思是當你在每個演員製作 – Guillaume

1

除了上面提供的答案,您可能只想考慮您的類的一般設計。如果nomeAnimalAnimal類應當真正意識到的東西,那麼將它推出(甚至變量的名稱表明它的Animal -ness)可能是有意義的。

如果沒有,那麼你可能需要進一步考慮通過增加displaySpecificInfo()到Animal類,並利用多態性要麼使它abstract,或添加在Animal類空的實現。這將允許你從當前的失敗打印調用中調用它,然後在派生類的實現中使用當前行。這將節省對演員的需求(不是說演員有任何問題),並且創建更多的符合OO/Encapsulation的實施。

編輯:

優秀注意到@Guillaume和我的道歉可能剝開的洋蔥OO更多層,那麼你有興趣! :)

+1

+1之前檢查正確的類(使用instanceof或isAssignableFrom)時,同意,但我認爲他希望首先獲得基礎知識:)我也正在建議使用組合而不是繼承,但這有點超出範圍 – Guillaume