2012-01-01 11 views
3

私はCay HorstmannのJava For Everyoneを使っています。型テストを使わないでdoTheTaskを宣言しますか?

私はそれを言うときに少し混乱しています:

タイプのテストを使用しないでください

これが変化する動作を実装するために、特定のタイプのテストのための instanceof演算子を使用してについてです

各クラスは次のようになります(本から直接取ったもの):

if (q instanceof ChoiceQuestions) //Don't do this 
{ 
    //Do the task the ChoiceQuestion way 
} 
else if (q instanceof Question) 
{ 
    //Do the task Question way 
} 

明らかに、これは0のような新しいクラスが追加されました。タイプテストを行うプログラムのすべての部分を修正し、別のケースを追加する必要があります。

プログラムにクラスNumericQuestionを追加することをお勧めします。タイプテストではなく、多態性を使用しているので、変更する必要はありません。 クラスの階層でタイプテープを使用しようとするときは、代わりに多態性を再考して使用してください。メソッドdoTheTaskをスーパークラスに宣言し、サブクラスでオーバーライドしてq.doTheTask()を呼び出してください。

最後の段落は上記のものです。誰かが私にそれを意味するものの例を靴で磨くことができますか? (私は視覚的な学習者の一種です)。私たちは実際に氷点下試験を使わずにこれをどうやって行うのですか?

+0

これは基本的な多形性です。オブジェクト指向プログラミングの背後にある2-3の主な原則の1つです。あなたは、多形性に関するいくつかの良い記事を見つけてそれらを勉強し、次にあなたの脳にその概念を得るためにそれらを実験するためのいくつかの "おもちゃ"プログラムを行う必要があります。 –

答えて

1

点は、これに代えてということです

public void doTheTask(String someParameter){ 
    //Do the task Question way 
} 

をしてChoiceQuestionクラスが含まれているの

あなたは新しいクラス DrawQuestionを得るとき
public void doTheTask(String someParameter){ 
    //Do the task the ChoiceQuestion way 
} 

そして、それは

public void doTheTask(String someParameter){ 
    //Do the task the DrawQuestionway 
} 

しかしdoTheTask()を変更する必要があります呼び出すコードのいずれもが含まれています!if (q instanceof ChoiceQuestions)パターンがあるので、新しいロジックを追加することを忘れるリスクはありません。そして、これは実際には長期的にはより重要な部分です。特定の種類のQuestionに関係するすべてのロジックは、アプリのすべての部分に広がるのではなく、1つのクラスに集中しています。

0

デザイン原則として、動作を制御するためにinstanceofを使用して、異なる(オーバーライドされた)動作を持つサブクラスを作成することをお勧めします。

1

あなたが理解しておくべきことは、そのクラスがその動作に責任があり、exmapleからの呼び出し部分ではないということです。私はこれを "テーブルは自分自身を塗るべき"と学んだ。原理:

家具を視覚化する。あなたは家具を塗る画家クラスを持っていますが、宣言するたびに新しいタイプの家具を描く方法を "学ぶ"必要があります。だから、

ペインタ:

if (q instanceof Table) //Don't do this 
{ 
    //paint table 
} 
else if (q instanceof Closet) 
{ 
    //paint closet 
} 

あなたは何をすべきかは、あなたがすべての家具はメソッドpaintThySelf()を知っている「家具」クラスを拡張させることです。だから今画家はちょうど

q.paintThySelf() 

を行い、あなたは椅子のクラスを追加した場合、あなたはpaintThySelf()メソッドを追加する必要があります、そしてあなたはそれが塗装することができます。

q.doTheTask(); 

Questionクラスが含まれている場所:

if (q instanceof ChoiceQuestions) //Don't do this 
{ 
    //Do the task the ChoiceQuestion way 
} 
else if (q instanceof Question) 
{ 
    //Do the task Question way 
} 

あなたがこれを行う必要があります。

関連する問題