質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

2回答

1182閲覧

オブジェクト指向設計における全クラスの基底クラスの作成

gauss0322

総合スコア9

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

1クリップ

投稿2020/01/09 00:58

編集2020/01/09 01:01

ソースコードを読んでいると時々下記のような設計を見つけます。

・基本クラスを定義する(実装はなし)
class infrastructure {}
・すべてのクラス継承の大本をinfrastructureにする
class A extends infrastructure {} class B extends A {} class C extends B {} class D extends C {} class E extends C {} class X extends infrastructure {} class Y extends X {}

このような設計は、そういったデザインパターンのようなものがあるのでしょうか?
ある場合はパターン名や紹介されているサイト・書籍などが知りたいです。

また、こういった設計は「良い設計」といえるのでしょうか?
処理の共通化を目的とするならば、継承ではなく委譲を利用すべきと思いますし、インターフェイスの共通化ならば、interfaceで事足りるような気がします...。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/01/09 01:01

場合によります。
Zuishin

2020/01/09 01:08

例えば .NET の全てのクラスの親となる Object クラスは文字列化のための ToString メソッドや比較のための Equals メソッドや GetHashcode メソッドなど複数のメンバーを実装しています。これをインターフェースにして一つ一つのクラスで実装するのではクラスの作成が非常に煩雑になるでしょう。
gauss0322

2020/01/09 01:13

よくある、Objectクラス(ToStringなど)は、おっしゃる通り意味があると思います。ただ、その基本クラスに「実装がない」ものがあります。実装がないクラスを継承して、意味があるのか...と。「将来的な拡張性を見据えて」といった感じですか?
Zuishin

2020/01/09 01:15

抽象クラスのメリットについて聞きたいというのがこの質問の主旨ですか?
gauss0322

2020/01/09 01:17

すみません。 抽象クラス自体(abstract)は、インターフェイスの共通化という面でメリットがあると思っています。 抽象メソッドすらない、基底クラスの必要性がよくわからないです...。
gauss0322

2020/01/09 01:20

すみません。「実装がない」という書き方は、語弊があったかもしれません。クラスプロパティも、クラスメソッドも、抽象メソッドも何もないクラスを基底クラスとしてして定義されています。 (質問文のinfrastructure クラスそのもの)
Zuishin

2020/01/09 01:21

メンバーを加えない基底クラスは例えば「オブジェクトがそのクラスを継承していれば」という分岐に使えます。
Zuishin

2020/01/09 01:24

これも例えばの話ですが、シリアライズする際に独自に実装したクラス以外は省くというコードが簡単に書けます。 いずれにせよ「何のために」と聞かれたら「コードを読めばわかるんじゃないか」が一番に来ます。個々の具体的な設計思想に依るところが大きいと思います。
gauss0322

2020/01/09 01:32

>個々の具体的な設計思想に依るところが大きいと思います。 やはり、そうですよね....。 すで当初の設計者がいない場合など、設計思想をコードそのものから読み解くのって結構難しく苦労します。 ありがとうございます。
Zuishin

2020/01/09 01:46

この場合別に読み解かなくても放っておけばいいように思います。新しいクラスを作る時には前例に倣えばいいんじゃないでしょうか。
guest

回答2

0

ベストアンサー

あくまで個人的な意見ですが、メンバが存在しないクラスであっても、それが設計上意味のある「物」の概念のまとまりを表しているのであれば意味があると思いますし、悪い設計上ではないと思います。

例えば空のMammalクラスを継承してDogやCatやHumanが定義されているならまぁ意味があるのだと推測できますが、MasterとかBaseとか何を意味してるのかいまいち分からない名称の空のクラスを継承してHumanやMountainと概念的に共通性の乏しいクラスが定義されているなら設計の悪さを疑います(それによって何か妙な効率化がされていたとしてもです)

質問の例のinfrastructureの場合、それを継承するすべてのクラスが何かをささえるインフラという概念に当てはまるものであれば可、単に漠然と全部の基底だからinfrastructureとなっているなら不可と言ったところでしょうか。

繰り返しになりますがまぁ個人的な意見です。この手の話は明確な答えが出ないことが多いので。

投稿2020/01/09 03:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語でいうところのvoid*の使い方にあたります。

投稿2020/01/09 01:07

homu_homu_ai

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/01/09 01:09

意味不明です。
BeatStar

2020/01/09 01:44 編集

横からすみません。 言いたいことはわかりますけど、(失礼ですが)言葉足らずでは?
Zuishin

2020/01/09 01:48

私には全くわからないので説明してもらえますか?
Zuishin

2020/01/09 01:51

void* が汎用ポインタというところまではわかります。 基本クラスをそのまま拡張したクラスとどこにどのような共通点があり、質問とどう結びつくのかがわかりません。
BeatStar

2020/01/09 01:53 編集

(追記に対して): ああ、意味を取り間違えていました...
Zuishin

2020/01/09 01:52

高評価の意味もわからないのでその解説もお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問