Index: [Article Count Order] [Thread]

Date:  Wed, 22 May 2002 13:53:22 +0900
From:  "Ito Yoshiichi" <*************@******.*******.**.**>
Subject:  [oosquare-ml:02701] Re: ミキシン( Mixin) とは?また Java での実装方法は?
To:  <***********@***.***.*******.**.**>
Message-Id:  <****************************.*************@******.*******.**.**>
In-Reply-To:  <007301c2013d$ac066bd0$********@*********>
X-Mail-Count: 02701

伊藤@オージスです。

Yuji Tatsuta さん [mailto:*******@***********.***]
> お世話になります。
> 竜田と申します。
>
> オブジェクト指向を勉強中の初心者です。
>
> 私が読んでいる書物に、「社員」「営業職」「管理職」をクラスとして扱い、
> 「営業管理職社員」を表す方法に、
> 「社員」クラスは現実的で物理的な存在に対して、「営業職」「管理職」は
> 抽象的な概念クラスであり、補助的な役割をするとと解説されています。

老婆心ながら...
この手の質問をされる場合は、具体的に書名等あげられた方が
よろしいのでは。

> また、「営業職」「管理職」クラスはミキシンと呼ばれると解説されています。
>
> ここまでは、なんとなく理解できるのですが、それをJavaで実装するための
> 方法が今一、理解できません。
> (多重継承を用いることなく、実装できる手法と理解したのですが、、、)
>
> どのように実装するのでしょうか?

ミキシン風に書くとこうなると思います。

  public interface 営業職 { ... }
  public interface 管理職 { ... }
  public class 営業職実装 implements 営業職 { ... }
  public class 管理職実装 implements 管理職 { ... }

  public class 社員 { ... }

  public class 営業職社員 extends 社員 implements 営業職 {
    private 営業職 eigyoshoku = new 営業職実装();
    営業職のメソッド() { 営業職実装へ委譲 }
  }

  public class 管理職社員 extends 社員 implements 管理職 {
    private 管理職 kanrishoku = new 管理職実装();
    管理職のメソッド() { 管理職実装へ委譲 }
  }

  public class 営業管理職社員 extends 社員
      implements 営業職, 管理職 {
    private 営業職 eigyoshoku = new 営業職実装();
    private 管理職 kanrishoku = new 管理職実装();
    営業職のメソッド() { 営業職実装へ委譲 }
    管理職のメソッド() { 管理職実装へ委譲 }
  }

ただ、このようにした場合、

  ・異なる職種の組合せごとにクラスを作らないといけない。
  ・職種の追加、変更、削除ができない。

などの問題があります。

> また、この例の「営業職」「管理職」は多重分類にはならないのでしょうか?
>
> 多重分類に関する書物を読むと、多重継承とは異なるとあり、上記の例は
> 多重継承の説明として記述されています。

多重分類風に書くとこうなると思います。

  public class 職種 { ... }
  public class 営業職 extends 職種 { ... }
  public class 管理職 extends 職種 { ... }

  public class 社員 {
    private java.util.List<職種> shokushu;
    ...
  }

これだと、最初のコード例での欠点は解消していますが、

  ・どの職種に属しているか静的なチェックができない。
  ・各職種のメソッドを使用する場合、ダウンキャストが必要になる。

などの問題があります。

結局どちらの形にするかはトレードオフだと思います。

> この辺りもよく、理解できないでいます。
>
> 宜しく、お願いいたします。

----------------------------------------
Ito Yoshiichi (伊藤 喜一)
Object Technology Center, OGIS-RI Co., Ltd.
E-mail: *************@******.*******.**.**