###継承先で使わないこともあるメソッドを持ったスーパークラスを作成してもよい?
クラスA, B, C, Dを作成するとき、
クラスAにはa, b, cメソッド
クラスBにもa, b, cメソッド
クラスCにはa, cメソッド
クラスDにはb, cメソッド
(異なるクラスにおいても、同じ名前のメソッドは同じ処理内容)
を作る持たせることになったのですが、
同じ内容のメソッドを書くのは面倒なので、
スーパクラスとなるクラスSを作ろうと考えました。
クラスSにはa, b, cメソッドすべてを持たせようと思ったのですが、
クラスCにとっては、bメソッドは不要。
クラスDにとっては、aメソッドは不要。
となるので、クラスSにすべてのメソッドを持たせてはいけないのではないかと思いました。
このようなクラス設計はありなのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
上の質問文を見ていると、「コードを共通化するため」に継承を利用しようとしていますが、それは本来の使い方ではありません。
リスコフの置換原則という言葉があって、端的に言えば「コード上で基底クラスの現れるところには、どの派生クラスをもってきても問題ないようにしないといけない」ということです。
上の状況では、A
、B
、C
、D
を統一的に扱うためではなく、コードを省略するためだけに親クラスのS
を用意しているようですが、これは本来的な親クラスの役割ではありません。
投稿2018/01/18 05:50
総合スコア146543
0
ベストアンサー
他の方も書いている通り、よくないやり方です。
処理を共通させるのが目的であれば、他の方法があります。
方法1. デフォルトメソッドを持ったインターフェースを実装する
デフォルトメソッドaを持ったインターフェース1
デフォルトメソッドbを持ったインターフェース2
デフォルトメソッドcを持ったインターフェース3
をそれぞれ作成し、
クラスAにはインターフェース1,2,3を実装
クラスBもインターフェース1,2,3を実装
クラスCにはインターフェース1,3を実装
クラスDにはインターフェース2,3を実装
というふうにすれば、質問内容の通りのことができるはずです。
(但し、デフォルトメソッドもフィールドを使用できない等の制約があるので、必ずしもできるとは限りませんが・・・)
方法2. 処理の委譲を行う
メソッドaを持ったクラス1
メソッドbを持ったクラス2
メソッドcを持ったクラス3
をそれぞれ作成し、
クラスAのフィールドとしてクラス1,2,3を持たせ、クラスAのメソッドa,b,c内にて、それぞれクラス1,2,3のメソッドを呼び出すようにする
クラスBのフィールドとしてクラス1,2,3を持たせて同様の事を行う
クラスCのフィールドとしてクラス1,3を持たせて同様の事を行う
クラスDのフィールドとしてクラス2,3を持たせて同様の事を行う
というふうに実装するやり方です。
継承は元々、制約が大きいので、委譲による継承という方法があるのです。
投稿2018/01/18 06:11
編集2018/01/18 06:15総合スコア253
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/19 01:29

0
異なるクラスにおいても、同じ名前のメソッドは同じ処理内容
同じ内容のメソッドを書くのは面倒なので、
この辺がキモなんですよねきっと。
メソッドの内容がどういったものになるかにもよると思うのですが、たとえば
- クラスAには「インターフェースA」「インターフェースB」「インターフェースC」
- クラスDには「インターフェースB」「インターフェースC」
のように実装し、
別途 Utility クラスなどを作って
「インターフェースAを引数として受け取り、処理を行うメソッド」
などを作成。
a, b, cメソッドで Utility のメソッドを呼ぶ。
とか どうでしょうか・・・?
(私もこの辺の共通化のセンスがイマイチなので 一案程度で流してください)
投稿2018/01/18 06:39
編集2018/01/18 08:47総合スコア1126
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/01/18 11:19

0
考え方からするとやめたほうがいいと思います。
仮にクラスEが出来た時、cメソッドは必要でしょうか。
スーパークラスの共通メソッドは継承した各クラスで使う
スタンダードなメソッド(振る舞い)のみにするべきです。
設計上、クラスA,B,C,Dはどのような関係になるのでしょうか。
密接な関係があれば、考え方が正しかもしれませんが
単純に同じ処理ということであれば、
共通クラスなど別で考えたほうがいいです。
投稿2018/01/18 05:58
総合スコア1400
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/19 00:23