- - PR -
class or interface ?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-08-28 17:30
よつもとです。
Junさんが例として挙げられているソースコードは、 「何のためにprotectedが必要になるのかを示す」 ではなく 「protectedなメソッドをinterfaceに埋め込むのはこんなに大変なんだぞ」 という例に見えます。 主張の実現にこだわるあまり、本末転倒になっていませんか? | ||||||||
|
投稿日時: 2003-08-28 18:00
ほむらです。
---------- uk氏へ
まだ文法的なことを覚え始めたばかりで難しいことは良くわかってないのです。 委譲の意味もわかっていないし デザインパターンについては手もつけてませんし^^;;;;;; 現状としてあげたサンプルではabstractを使用して処理を下位クラスに 処理委託することが明示的に書いてあるので問題はないと思っていたのですが 始めのほうは、中間のクラスにそういうのが書いてなかったので 何を使えばいいのか解決できないんじゃないかな〜と疑問に思ったわけです。。。 よく見てみれば単に省略されていただけと考えればよいのかなとも思えてきましたが Jun氏へ interface を 隠蔽するというのはこんな感じ?
一応隠蔽はしてありますけど。。。 interfaceごと隠蔽してしまっているので一括管理は無理ですが^^;;;; こんな感じのことをもっと簡単(直感的)にわかるように書きたいということ でしょうか? | ||||||||
|
投稿日時: 2003-08-29 09:35
ちょっと引用の仕方がわからないので引用しませんが, mRメソッドは呼び出さないの
です.mRメソッドを呼び出しているメソッドを呼び出すだけです.そのメソッドの内部では mRメソッドが呼ばれています.mRメソッドは本来privateであるべきですが, そうすると javaの現仕様ではオーバーライドできないのでprotectedにしてあります.publicよりまし というに過ぎません. mR自身は外部から呼ばれないということです. 継承階層の内部のほかのpublicなメソッドから呼ばれます. | ||||||||
|
投稿日時: 2003-08-29 09:39
引用の方法がわかったので追記します
委譲は「使わざるを得ない」ものでなく、むしろ 積極的に使うべきものだと私は思います。 委譲を使わないですむ方法があればそのほうがよいに決まっています. 委譲は手間がかかります. これはいわゆるTemplate Methodパターンですよね。 しかし、同様のことはStrategyパターンを用いてもできます。 こちらは委譲ベースのパターンなので、メソッドのアクセス制限を 意識する必要はありません。 Junさんの悩みも、Template MethodからStrategyへの置き換えをすれば すぐに解決するものではないですか? [/quote] ちょっとStrategyというのを知らないのでできれば簡単な説明を付け加えてもらえると ありがたいです. ただinterfaceを使うのも元を正せば委譲を使いたくないからです | ||||||||
|
投稿日時: 2003-08-29 09:45
そのとおりprotectedが必要であることを示すというよりprotectedなメソッドが interfaceで利用できたら今より便利だということを示すものです protected abstractなメソッドは私は良く使い必要性も感じているので 特にそれを示す必要があるとは思わなかったのです. | ||||||||
|
投稿日時: 2003-08-29 10:14
「継承」と「委譲」を比べての事でしょうか? 「委譲」の方が「継承」よりクラス間の結合度が低いのはご存知ですか? (クラス間の結合度は低い方が良いのはご存知ですよね) 手間を惜しんでいたら良いものは作れませんよ。 | ||||||||
|
投稿日時: 2003-08-29 10:16
>protected abstractなメソッドは私は良く使い必要性も感じているので
これは無意味.Cプログラマーがポインタを良く使い, 必要性を感じたとしても,それはC言語限定での話. 他言語では他言語なりの設計やイディオムがある. >特にそれを示す必要があるとは思わなかったのです. で,結局根拠は? 根拠を示さない限り,根拠なしとみなされても当然と思いますが. | ||||||||
|
投稿日時: 2003-08-29 12:46
Wataです。
こういうのを実装の詳細といいます。 つまりinterfaceの実装者が各自できめればよいことであり、mRメソッドの実装を強制したところでなんのメリットもありません。ただ、interface設計者の自己満足と、実装者およびそのinterface型で変数を参照する人への嫌がらせになるだけです。 よって、interfaceに定義すべきはmRメソッドを呼び出しているメソッドの方であり、アクセス修飾子は当然publicで無ければなりません。もちろんそのメソッドの内部でmRメソッドを呼ぶかどうかはどうでもいいことです。 なんていうか、Junさんのやりたいことは、Cloneableインターフェイスの失敗と凄くよく似ているような気がします。 |