デフォルトコンストラクタがないクラスの継承
2003年4月11日(金曜日)
デフォルトコンストラクタがないクラスの継承
当初は hatomaru.dll は名前の示す通り鳩丸専用と考えていたので、テンプレートに対応する必要などは微塵もなかったのですが、諸事情によりテンプレートに対応することにしたので書き直し中です。
ついでにソースの整理もしていて、実はこっちが大変だったりします。なにしろコイツは私の初の本格 (?) C# プログラムであり、しかも私は Java も C++ も全然知らないのです。要するにオブジェクト指向に全く慣れていない訳なのでして、そんな私が最初に書いたモノはまあ何というか、実に醜い (見にくい) ソースなのでした。
※まあ今のレベルだってたかが知れているのですが、それでも当初よりはマシなので。……マシだと信じたい。
そんなわけで今の私の技術で書き直しているのですが、オブジェクト指向らしくベースクラスからの継承などをさせてみたところで微妙にハマりました。
現在 hatomaru.dll はえび日記、ぐろっさり、新生鳩丸掲示板#という 3種の異なる性質のリソースを提供することができます。これらはそれぞれ別のクラスなのですが、いずれも HatomaruPageBase というクラスから派生しています。というか、そのようにしました。
ところで HatomaruPageBase にはデフォルトコンストラクタがなく、コンストラクタには必ず引数を伴う仕様になっています。で、それを継承したら、こんなことを言われてしまいました。
bbs.cs(15,15): error CS1501: 引数を '0' 個指定できる、メソッド 'HatomaruPageBase' のオーバーロードはありません。
……当初はそもそも意味が分からなくて困惑しましたが、派生クラスにコンストラクタが明示されていない場合、派生クラスのコンストラクタは自動的にベースクラスのデフォルトコンストラクタを呼び出すのです。考えてみれば当たり前なのですが、デフォルトコンストラクタというところが味噌で、引数のあるコンストラクタは自動的には呼ばれないのでした。
そこで、派生クラスの側に似たような引数を持つコンストラクタを書いて、その中でベースのコンストラクタを呼ぼうとしてみましたが、やはり同じエラー。そもそもコンストラクタが呼ばれる時点でデフォルトコンストラクタを呼び出しているのですから当然です。
結論としては、派生クラスのコンストラクタをこんな風に書けば OK なのでした。
public Bbs(ParamStat param) : base(param){}
これっておそらく基礎中の基礎だと思うのですが、こんなところで詰まる私って駄目駄目かも。ともあれ、他に詰まる人がいるかもしれませんし、せっかくなので書いておきました。
- 「デフォルトコンストラクタがないクラスの継承」へのコメント (3件)
関連する話題: メモ / C# / プログラミング / hatomaru.dll / 失敗談
- 前(古い): しつこい MS02-008
- 次(新しい): メールサーバクラックに燃やす情熱