2011-12-08 14 views
0

から文字列を取得します。Javaは私がこれを持っている想像サブクラス

私はすべてのCliente

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

や動物を保持している1つのArrayListのはCliente

に動物の配列に今もし

を添加して、この

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

と同じように作成されています私はこれをする:

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

は、あなたがあなたのAnimalEstimacaoにをキャストする必要が

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

ありがとうございますが、ただ1つの質問です。 ((Estimacao)clientes.get(0).getAnimaisCliente(0))EstimacaoにAnimalをキャストするのは何ですか? – Favolas

+0

はい、それは1台の動物がエスティマカオではないことを意味し、それは失敗します(ClassCastException) - あなたがinstanceof – Guillaume

+0

'Estimacao extends Animal'でキャストする前にそれをチェックして、' Estimacao'に 'Animal'を落とすことができます。私はあなたの質問を持っているか分からない – korifey

5

を試してみてください。しかし、明らかに、あなたが前にあなたのAnimalは、右のクラスであることを確認し、例外を危険にしたくない場合は:

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

素晴らしい。今、私はこの種の例外を制御する方法を知っています – Favolas

0

Estimacao

0

で定義されたメソッドにアクセスするにはEstimacaoAnimalキャストあなたが求めているように直接には不可能です。ただし、基本クラス(Animal)にgetNomeAnimal()を追加すると、nullまたは空の文字列が返され、Estimacaoクラスのインスタンスが正しい値を返します。

0

これはあなたの動物のクラスで置き忘れ使い方です:

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

はそれをこの方法を考える:サブクラスのインスタンスも、スーパークラスのインスタンスです。しかし、スーパークラスのインスタンスは必ずしもサブクラスのインスタンスである必要はありません。したがって、スーパークラスメソッドは常に両方で使用できますが、サブクラスメソッドはサブクラスでのみ使用できます。

サブクラスのインスタンスがある場合は、それを明示的にキャストしてサブクラス固有のメソッドを呼び出すことができますが、その際には注意が必要です。

0

動物型オブジェクトをEstimacao型にキャストしない限り、できません。キャストの後でのみ、getNomeAnimal()が利用可能になります。しかし、これはやりにくいことです。配列にAnimalタイプとEstimacaoタイプのオブジェクトが混在している場合、ClassCastExceptionで失敗します。

+0

あなたがしていることを知っているときは必ずしも悪くはありませんが、キャストする前に必ずチェックしてください。そして、とにかく、通常キャストすることは、悪いデザインを示しているので、それを完全に再訪する必要があるかもしれません。 – Guillaume

+0

私は完全に同意します。しかし、配列内に他のサブタイプのオブジェクトがないことがわかっている場合は、AnimalではなくEstimacaoオブジェクトの配列を持つことができます。しかし、私は現在の実装を完全に訪問する必要があることに同意します。 – Drona

+0

私が「あなたが何をしているか知っているとき」と言ったとき、それぞれのキャストの前に正しいクラス(instanceofかisAssignableFromを使って)をチェックすると意味しました – Guillaume

1

上記の回答に加えて、クラスの一般的な設計を考慮する必要があるかもしれません。 nomeAnimalが、Animalクラスが本当に気づいていなければならないものなら、それを押し上げるのは意味があるかもしれません(変数の名前でさえもAnimal -nessです)。

ない場合は、さらにAnimalクラスにdisplaySpecificInfo()を追加し、それabstract作る、またはAnimalクラスの空の実装を追加することのいずれかによって、多型を活用することを検討してください。そうすれば、現在の失敗印刷呼び出しがどこから呼び出され、派生クラスの実装に現在の行があるかを知ることができます。これにより、キャストの必要性が軽減され(鋳造に間違いがないわけではない)、より多くのオブジェクト指向/カプセル化準拠の実装が作成されます。

編集:潜在的に興味があり、その後OOタマネギの複数の層をバック剥離する@Guillaumeと私の謝罪によって

優秀ノート! :)

+1

+1、合意しましたが、私はまた、継承の代わりに合成を使用することを提案しようとしていましたが、それは範囲外です – Guillaume

関連する問題