- - PR -
クラス設計(継承に関して)
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-08 13:34
Hand クラスを変更できるのなら、null を返すなり Exception を投げるなりする getThum() を追加してしまいたいですね。(ついでに boolean hasThum() とか)
おそらくそういうことができない状況なのでしょうけれど、参考になれば...。 | ||||||||||||||||
|
投稿日時: 2004-03-08 17:41
Animal クラスのサブクラスによって、getHand メソッドが返すオブジェクトの型が
異なるのであれば、私は Hand オブジェクトの保持と getHand メソッドの実装を Animal クラスのサブクラスに任せます。 で、Animal クラスは何をするかというと getHand メソッドの定義だけをします。 つまり、Animal クラスを抽象クラスにします。 そして、Human#getHand メソッドが返すオブジェクトの型が HumanHand クラスしかありえない場合は、Human クラスに HumanHand オブジェクトを返す getHumanHand メソッドを作ります。
ただ、HumanHand クラスのインスタンスが Hand オブジェクトとして振る舞うことが ないのであれば Animal クラスと Human クラス、Hand クラスと HumanHand クラスを それぞれ独立させた方がいいかも知れません。 | ||||||||||||||||
|
投稿日時: 2004-03-09 00:28
unibon です。こんにちわ。
私はあまり良く分からないのですが、とりあえず思っていることを書いてみますと、Human に対して getHand して返ってくる Hand 型の返り値の実行時のクラスが HumanHand であることはどこで規定されているのか(規定されていないのではないか?)、という疑問があります。 たしかに Human クラスは HumanHand クラスをフィールド(集約)として持っています。しかし、だからと言ってそのフィールドと getHand メソッドが結びつくとは、クラスの継承関係では規定されていません。 そのような結び付けを規定するとすれば、Human クラスに getHumanHand メソッドを追加することがシンプルなような気がします。
たしかに「HumanHand」には親指はあるのは分かりますが、人間の「Hand」が「HumanHand」であることは自明ではないような気がします。 上記をまとめますと、結論としては、
と同じになりますが。 | ||||||||||||||||
|
投稿日時: 2004-03-09 03:03
みなさん、ご意見ありがとうございます。
現時点ではHandクラスは変更可能です。 が、今後MonkeyHandクラスやDogHandクラスができ、それら用の固有のメソッドを 定義するたびに、Handクラスを変更するのは避けたいです。 #DogHandって・・・(笑)
HumanクラスのgetHand()の返り値がHumanHandクラスのインスタンスであることは、 Humanクラスの定義で規定できるから、HumanHandクラスを返り値に指定できればいいのに、 と考えてました。(指摘のとおり、継承関係だけからは規定できませんが) 結局、unibonさん、架空兎さん、ぽんさんが言われているように、getHumanHand()を 別途定義するというのがこの場合の最善策なのかな? P.S. ところで、「親指」のスペルが間違ってました(爆)。 正しくはThumbです。 | ||||||||||||||||
|
投稿日時: 2004-03-09 09:51
unibon です。こんにちわ。
今まで知らなかったのですが、バージョン 1.5 だとコンパイルできるみたいです。 たとえば、こんな感じ。
コンパイルしてしまえば 1.5 未満でも動くみたいです。 | ||||||||||||||||
|
投稿日時: 2004-03-09 12:32
自分
Unibonさん
やっぱ、Javaだったのね。 でも、C++触ってた頃から、この仕様のお世話になったことないのよね〜 個人的にはあまり利用しなさそうな気が。 | ||||||||||||||||
|
投稿日時: 2004-03-09 16:24
まず、既に指摘があるようにAnimalクラスにgetHandメソッドがあることが不自然です。
ここに出てきた記述でははっきりしないのですが、HumanクラスのインスタンスをAnimal 型として扱うことがあるのでしょうか? でなければAnimalクラスにgetHandを持たせる 意味はないでしょうし、扱うことがあるとすると、例えばDogクラスのインスタンスを Animal型として扱うときにどうするか、というのが問題になると思います。 少し気になるのは、Animalクラスとそのサブクラスを構造を持ったデータ型として扱い、 その振る舞いを外部で定義しようとしているのではないか、ということです。振る舞いは 情報を持っているクラスに任せるのが基本ですが、そのようになっていないのではないですか? | ||||||||||||||||
|
投稿日時: 2004-03-09 19:19
unibon です。こんにちわ。
ちなみに、戻り値の型をオーバーライド時に変えることについては、 http://www.mamezou.com/tec/Tips/javaGenericsVsCppTemplate/article2.html#Section1-18 に、分かりやすい解説があるのを見つけました。 | ||||||||||||||||
