- PR -

class or interface ?

投稿者投稿内容
酒樽
会議室デビュー日: 2002/06/06
投稿数: 10
投稿日時: 2003-08-28 17:30
よつもとです。

Junさんが例として挙げられているソースコードは、
「何のためにprotectedが必要になるのかを示す」
ではなく
「protectedなメソッドをinterfaceに埋め込むのはこんなに大変なんだぞ」
という例に見えます。
主張の実現にこだわるあまり、本末転倒になっていませんか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-08-28 18:00
ほむらです。
----------
uk氏へ
引用:
これができなければTemplate Methodパターンを実装することができないということに
なってしまいますが。


まだ文法的なことを覚え始めたばかりで難しいことは良くわかってないのです。
委譲の意味もわかっていないし
デザインパターンについては手もつけてませんし^^;;;;;;

現状としてあげたサンプルではabstractを使用して処理を下位クラスに
処理委託することが明示的に書いてあるので問題はないと思っていたのですが

始めのほうは、中間のクラスにそういうのが書いてなかったので
何を使えばいいのか解決できないんじゃないかな〜と疑問に思ったわけです。。。
よく見てみれば単に省略されていただけと考えればよいのかなとも思えてきましたが

Jun氏へ
interface を 隠蔽するというのはこんな感じ?
コード:
import java.lang.*;

interface RR { void mR(); }
abstract class CC_Base
{
  protected RR r;
  public abstract void t(int i);
}

class CC01 extends CC_Base
{
  protected class CC01_inner implements RR
  {
    public CC01_inner(){}
    public void mR(){ System.out.println("CC01_inner!!"); }
  }

  public CC01(){ r = new CC01_inner(); }
  public void m( int i ){ r.mR(); }
  public void t( int i ){ System.out.println("CC01 " + i); }
}

class CC02 extends CC_Base
{
  protected class CC02_inner implements RR
  {
    public CC02_inner(){}
    public void mR(){ System.out.println("CC02_inner!!"); }
  }

  public CC02(){ r = new CC02_inner(); }
  public void m( String s ){ System.out.println(s); r.mR(); }
  public void t( int i )   { System.out.println("CC02 " + i); }
}

public class test02
{
  public static void main(String[] args){
    CC01 cc = new CC01();
    cc.m(32);
    cc.t(111);
    /*
      CC02 cc = new CC02();
      cc.m("Test");
      cc.t(333);
    */
  }
}


一応隠蔽はしてありますけど。。。
interfaceごと隠蔽してしまっているので一括管理は無理ですが^^;;;;
こんな感じのことをもっと簡単(直感的)にわかるように書きたいということ
でしょうか?
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-08-29 09:35
ちょっと引用の仕方がわからないので引用しませんが, mRメソッドは呼び出さないの
です.mRメソッドを呼び出しているメソッドを呼び出すだけです.そのメソッドの内部では
mRメソッドが呼ばれています.mRメソッドは本来privateであるべきですが, そうすると
javaの現仕様ではオーバーライドできないのでprotectedにしてあります.publicよりまし
というに過ぎません.
mR自身は外部から呼ばれないということです.
継承階層の内部のほかのpublicなメソッドから呼ばれます.
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-08-29 09:39
引用の方法がわかったので追記します

委譲は「使わざるを得ない」ものでなく、むしろ
積極的に使うべきものだと私は思います。

委譲を使わないですむ方法があればそのほうがよいに決まっています.
委譲は手間がかかります.

これはいわゆるTemplate Methodパターンですよね。
しかし、同様のことはStrategyパターンを用いてもできます。
こちらは委譲ベースのパターンなので、メソッドのアクセス制限を
意識する必要はありません。

Junさんの悩みも、Template MethodからStrategyへの置き換えをすれば
すぐに解決するものではないですか?
[/quote]

ちょっとStrategyというのを知らないのでできれば簡単な説明を付け加えてもらえると
ありがたいです.
ただinterfaceを使うのも元を正せば委譲を使いたくないからです
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-08-29 09:45
引用:

よつもとさんの書き込み (2003-08-28 17:30) より:
よつもとです。

Junさんが例として挙げられているソースコードは、
「何のためにprotectedが必要になるのかを示す」
ではなく
「protectedなメソッドをinterfaceに埋め込むのはこんなに大変なんだぞ」
という例に見えます。
主張の実現にこだわるあまり、本末転倒になっていませんか?


そのとおりprotectedが必要であることを示すというよりprotectedなメソッドが
interfaceで利用できたら今より便利だということを示すものです
protected abstractなメソッドは私は良く使い必要性も感じているので
特にそれを示す必要があるとは思わなかったのです.
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-08-29 10:14
引用:

Junさんの書き込み (2003-08-29 09:39) より

委譲を使わないですむ方法があればそのほうがよいに決まっています.
委譲は手間がかかります.


「継承」と「委譲」を比べての事でしょうか?
「委譲」の方が「継承」よりクラス間の結合度が低いのはご存知ですか?
(クラス間の結合度は低い方が良いのはご存知ですよね)

手間を惜しんでいたら良いものは作れませんよ。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-08-29 10:16
>protected abstractなメソッドは私は良く使い必要性も感じているので
これは無意味.Cプログラマーがポインタを良く使い,
必要性を感じたとしても,それはC言語限定での話.
他言語では他言語なりの設計やイディオムがある.

>特にそれを示す必要があるとは思わなかったのです.
で,結局根拠は?

根拠を示さない限り,根拠なしとみなされても当然と思いますが.
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-08-29 12:46
Wataです。
引用:

Junさんの書き込み (2003-08-29 09:35) より:
mRメソッドは呼び出さないのです.mRメソッドを呼び出しているメソッドを呼び出すだけです.そのメソッドの内部では mRメソッドが呼ばれています.


こういうのを実装の詳細といいます。
つまりinterfaceの実装者が各自できめればよいことであり、mRメソッドの実装を強制したところでなんのメリットもありません。ただ、interface設計者の自己満足と、実装者およびそのinterface型で変数を参照する人への嫌がらせになるだけです。

よって、interfaceに定義すべきはmRメソッドを呼び出しているメソッドの方であり、アクセス修飾子は当然publicで無ければなりません。もちろんそのメソッドの内部でmRメソッドを呼ぶかどうかはどうでもいいことです。

なんていうか、Junさんのやりたいことは、Cloneableインターフェイスの失敗と凄くよく似ているような気がします。

スキルアップ/キャリアアップ(JOB@IT)