|
2008/08/17(Sun) 17:38:13 編集(投稿者)
■No23505 (スイカ さん) に返信 > 子クラスの方では、親クラスと全く異なったコンストラクタを作成したいということです。 子クラスと親クラスで、コンストラクタ引数が異なる事は良くあります。
ただ、だからといって、親の引数をどう与えるかで悩んでしまうという事は、 そもそものクラスの設計に、何か問題があるのかも知れません。
> 親クラスのコンストラクタを引き継ぐというわけではありません。 引き継がなくてはいけません。引き継ぐ必要が無いのであれば、それは 初期化の条件からして異なっているという事になるので、そもそもの クラス分けの設計段階から見直したほうが良いかと思います。
そもそも継承では、"Is-a 関係" を保つ必要があります。すなわち子クラスとは、 常に「親クラスの一種」でなければならないのですが、もしかしたら、 機能的に似ているだけで、意味的には無関係なクラスを継承で処理しようとしてはいませんか?
具体的に、現在どのようなクラスを作っているのかを明記した方が、 より具体的なアドバイスを得られるかと思いますよ。
たとえば、親クラスの > Public Sub New(ByVal intValue1 As Integer, ByVal intValue2 As Integer) という定義が、データの範囲を表す「最小値と最大値」を引数に取る Public Sub New(ByVal minValue As Integer, ByVal maxValue As Integer) の意味だったとして、これを子クラスでは「最小値」だけで指定したいとなれば、最大値を補完するために、 Public Sub New(ByVal minValue As Integer) MyBase.New(minValue, Integer.MaxValue) End Sub という実装になりますよね。
> 親クラスではメソッドやプロパティを持っており、 > それらは子クラスでも継承してそのまま使いたいために継承させたいです。 そういう時は、Class A を継承して Class B を作成するのでは無く、 Class A と Class B に、共通の「MustInherit Class C」を継承させたり、 共通の Inteface を Implements させることで対応できるかと思います。
あるいは、本当に両クラスが継承すべき関係にあるのなら、その場合の親クラスには Public Sub New(Integer, Integer) Public Sub New(String, String) だけではなく、子クラスから呼び出せるように、引数一つの Sub New(String) あるいは引数なしの Sub New() のいずれかが(Public ではなく、Friend や Protected でも可)実装されているものだと思います。
そしてそれが無いのであれば、その親クラスは、そういった利用のされ方が想定されて いないのですから、そもそも継承すべき関係では無かった(あるいは逆に、親クラスの実装不足)として クラス設計を見直した方が良いかも知れません。いずれにせよ、現状のクラス設計を見てみないと何とも。
|