- - PR -
abstract について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-09-01 13:18
banbooです。
「件名:iteratorの中で、iteratorで回す方法」の件では皆様にお世話になりました。 上記に関連する事で、新たに疑問が生じたので、板を変えて質問をさせて下さい。 abstract について質問が御座います。 CombineInfo,RequestInfo,ResponseInfoの三つのクラスがあります。 RequestInfoは属性として、 id,ipAddress, name をもっております。(setter,getter有り) ResponseInfoは属性として、 result をもっております。 それで、 CombineInfoはRequestInfoとResponseInfoの両方の属性、すなわち id,ipAddress, name,result を持ちたいと考えております。(setter,getter有り) このように親クラスの持つ全ての属性のうち 片方の属性を、子クラス1で実装し、親クラスの残りの属性を子クラス2で実装したいと 思っております。 イメージとしては 下記のプログラムのようなのですが、 CombineInfoクラスをabstractにしたため、うまくコンパイルできません。 質問したい事は 1. 上記のような目的を実現するためには、どのような設計にすればよいのか (何かデザインパターンとかありますでしょうか?) 2. CombineInfoクラスをabstractにしないで、全ての属性を実装する。 そして、サブクラスで親クラスのメソッドを呼び出す ようにすればよいだけの事でしょうか(親クラスが全て実装してしまったら サブクラスがある意味がありませんが・・・)? 3. 親クラスは、二つの子クラスのオブジェクトを持つように 設計する方が綺麗でしょうか? つまり、 CombineInfo cInfo = new CombineInfo(); cInfo.add(resInfo1, reqInfo1); cInfo.add(resInfo2, reqInfo2); です。 上記に関しまして、アドバイス等ございましたら御願い致します。 abstract class CombineInfo { private String id; private String ipAddress; private String name; private String result; public abstract String getId(); public abstract String getIpAddress(); public abstract String getName(); public abstract String getResult(); public abstract void setId(String string); public abstract void setIpAddress(String string); public abstract void setName(String string); public abstract void setResult(String string); } public class RequestInfo extends CombineInfo { private String id; private String ipAddress; private String name; /** * @return */ public String getId() { return id; } /** * @param string */ public void setId(String string) { id = string; } /** * @return */ public String getIpAddress() { return ipAddress; } /** * @return */ public String getName() { return name; } /** * @param string */ public void setIpAddress(String string) { ipAddress = string; } /** * @param string */ public void setName(String string) { name = string; } } public class ResponseInfo extends CombineInfo { private String result; /** * @return */ public String getResult() { return result; } /** * @param string */ public void setResult(String string) { result = string; } } | ||||
|
投稿日時: 2004-09-01 13:24
やっぱ3番じゃないですかね。
| ||||
|
投稿日時: 2004-09-01 13:40
Javaでは多重継承(一つの子クラスに複数の親クラスが存在すること)を許していません。 その為、このようなことをするには、3番を採用せざるを得ません。 もしくは、RequestInfoとResponseInfoをインタフェースとして定義し、CombineInfoは 両方のインタフェースをimplementし、具体的なメソッドの実装(Setter/Getterなど)は CombineInfo内で行う、という方法もあります。 | ||||
|
投稿日時: 2004-09-01 15:28
あいつーです。
違和感を感じるのですが、 RequestInfo及びResponseInfoと、CombineInfoは本当に継承の関係にあるのですか? 単に関連をつけたいだけであれば3が良いかと思います。 また、継承の関係にあるとしても、CombineInfoは親ではなく子になると思いますよ。 | ||||
|
投稿日時: 2004-09-02 02:07
この例の場合だと、CombineInfo は単に RequestInfo と ResponseInfo という
互いに無関係なものをひとつにまとめただけなので、 RequestInfo request; ResponseInfo response; の二つの属性とそのsetter/getterを持つ、というのが正解ではないかと思います。 CombineInfo と RequestInfo/ResponseInfo の関係は、kind-of ではなくて has-a であることが明白なので、継承にすべきではないでしょう。 # あいつーさんの言う「違和感」は、この辺が原因? | ||||
|
投稿日時: 2004-09-03 00:43
ソースを見ると普通に、コンパイルエラーですね。。
自分も継承ではなく CombineInfoがRequestInfoとResponseInfoをもつのだと思います class CombineInfo { RequestInfo req; ResponseInfo res; // あとは省略。。 } _________________ | ||||
1
