伊藤@オージスです。
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: *************@******.*******.**.**