ソースコードを読んでいると時々下記のような設計を見つけます。
・基本クラスを定義する(実装はなし)
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で事足りるような気がします...。
場合によります。
例えば .NET の全てのクラスの親となる Object クラスは文字列化のための ToString メソッドや比較のための Equals メソッドや GetHashcode メソッドなど複数のメンバーを実装しています。これをインターフェースにして一つ一つのクラスで実装するのではクラスの作成が非常に煩雑になるでしょう。
よくある、Objectクラス(ToStringなど)は、おっしゃる通り意味があると思います。ただ、その基本クラスに「実装がない」ものがあります。実装がないクラスを継承して、意味があるのか...と。「将来的な拡張性を見据えて」といった感じですか?
抽象クラスのメリットについて聞きたいというのがこの質問の主旨ですか?
すみません。
抽象クラス自体(abstract)は、インターフェイスの共通化という面でメリットがあると思っています。
抽象メソッドすらない、基底クラスの必要性がよくわからないです...。
すみません。「実装がない」という書き方は、語弊があったかもしれません。クラスプロパティも、クラスメソッドも、抽象メソッドも何もないクラスを基底クラスとしてして定義されています。
(質問文のinfrastructure クラスそのもの)
メンバーを加えない基底クラスは例えば「オブジェクトがそのクラスを継承していれば」という分岐に使えます。
これも例えばの話ですが、シリアライズする際に独自に実装したクラス以外は省くというコードが簡単に書けます。
いずれにせよ「何のために」と聞かれたら「コードを読めばわかるんじゃないか」が一番に来ます。個々の具体的な設計思想に依るところが大きいと思います。
>個々の具体的な設計思想に依るところが大きいと思います。
やはり、そうですよね....。
すで当初の設計者がいない場合など、設計思想をコードそのものから読み解くのって結構難しく苦労します。
ありがとうございます。
この場合別に読み解かなくても放っておけばいいように思います。新しいクラスを作る時には前例に倣えばいいんじゃないでしょうか。
回答2件
あなたの回答
tips
プレビュー