トップ回答者
親クラスと子クラスとの関係

質問
-
こんにちは、プログラム中困ったことがあったので、質問させていただきました。
開発環境は「Visual Studio 2005」で、プロジェクトはC#の「windous アプリケーション」です。
以下のソースコードで書いたプログラムが突然停止してしまって、困っています。
public class Koma
{Ou ou = new Ou();
}public class Ou:Koma
{
}実際のソースコードはもうちょと色々書いてあるのですが、たぶん親クラスで子クラスのインスタンスを作成したのが原因だろうと思って厳選しました。
そこで疑問に思ったのですが、設計上の考えかたとして親クラスが子クラスの舵を取るような設計は一般的にまちがっているのでしょうか?
たとえば今でいうと、親クラスである駒が、子供クラスである王や歩兵などをまとめて管理するような感じです。
よければ御回答ください。
回答
すべての返信
-
外池と申します。「厳選」は、正しいと思いますよ? その上で、よくよく考えてみてください。これだと、Komaのインスタンスをひとつ作ろうとするか、あるいは、Ou:Komaのインスタンスをひとつ作ろうとするかすると、連鎖的に無限にOu:Komaのインスタンスを作り続けようとしてしまいますよね・・・。
例えば、Komaのインスタンスをひとつ作ろうとする。すると、
Ouのインスタンスを新しく作るわけで、 (ゆくゆくはouにインスタンスの参照を代入するのですが、叶いません。)
その過程で、派生元のクラスKomaのコンストラクターが呼ばれて、
Ouのインスタンスを新しくつくるわけで、
(以下、繰り返し)
とりあえず、この連鎖を生じさせないようにプログラムすることが大事です。
あるクラスのインスタンスが、メンバー変数で同じクラス(派生させたクラスを含む)の別のインスタンスを参照すること自体は全然問題ありません。ものすごく一般的に行われることです。
-
SE_lain さんからの引用 public class Koma
{Ou ou = new Ou();
}public class Ou:Koma
{
}基底クラスが派生クラスの型を内部に持つことは、一般的に良い設計とは言えないじゃないかと思います。なぜなら、基底クラスは抽象化を行った結果であり、そこにその抽象化を拡大した派生クラスの厳密な型が入るのであれば、基底クラスで何のために抽象化を行ったのかわからなくなるからです。シンタックス的にどうのというよりも、クラスの継承的な設計としてどうかなと思うのです。簡単な例を出せば、
乗り物 - 飛行機 - B747
+--- B767
+--- B777
は、きれいな抽象化だと思いますが、
乗り物 - 飛行機(B747含む) - B747
+--------- B767
+--------- B777
は、きれいに抽象化されているとは一般的に言えないと思いませんか?