2009-03-13 10 views
0

私はそれが新しいコンストラクタのかなりの数のパラメータを含む基本クラスを持っています。 Superベースクラスを継承する7つのサブクラスがあります。私の質問/問題は、すべてのサブクラスは、基本クラスのNewコンストラクタのほとんどのパラメータに同じ値を使用し、これらのサブクラスは順番に呼び出すことができます。私は、スーパークラスの共通の値を設定し、それぞれのサブクラスのためにそれらを使用したいと思いますが、これを行う良い方法を思いつくことはできません。これを行う方法を理解できれば、各サブクラスのMyBase.New呼び出しでこれらのパラメータをすべて渡す必要はありません。私は私の新しいとして、私は、各サブクラスで「MyBase.New」への冗長呼び出しを取り除くしたいVB.Net OOPの質問 - スーパークラス、MyBase.netとコンストラクタのパラメータ

Public Class BaseRequest 

    Public Sub New(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String, ByVal param4 As String, ByVal param5 As String, ByVal param6 As String, ByVal param7 As String, ByVal param8 As String, ByVal param9 As String, ByVal param10 As String) 

     'Private Level Variables Assigned Here' 

    End Sub 

End Class 

Public Class SubClass1 
    Inherits BaseRequest 


    Public Sub New(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String, ByVal param4 As String, ByVal param5 As String, ByVal param6 As String, ByVal param7 As String, ByVal param8 As String, ByVal param9 As String, ByVal param10 As String) 

     MyBase.New(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10)  
    End Sub 

End Class 

Public Class SubClass2 
    Inherits BaseRequest 

    Public Sub New(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String, ByVal param4 As String, ByVal param5 As String, ByVal param6 As String, ByVal param7 As String, ByVal param8 As String, ByVal param9 As String, ByVal param10 As String) 

     MyBase.New(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10)  
    End Sub 

End Class 

Public Class SubClass3 
    Inherits BaseRequest 

    Public Sub New(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String, ByVal param4 As String, ByVal param5 As String, ByVal param6 As String, ByVal param7 As String, ByVal param8 As String, ByVal param9 As String, ByVal param10 As String) 

     MyBase.New(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10)  
    End Sub 

End Class 

Private Sub CallClasses 

    If CallClass1 Then 
     Dim sClass1 As New SubClass1(Param1Value, Param2Value, Param3Value, Param4Value, Param5Value, Param6Value, Param7Value, Param8Value, Param9Value, Param10Value) 
    End If 

    If CallClass2 Then 
     Dim sClass2 As New SubClass2(Param1Value, Param2Value, Param3Value, Param4Value, Param5Value, Param6Value, Param7Value, Param8Value, Param9Value, Param10Value) 
    End If 

    If CallClass3 Then 
     Dim sClass3 As New SubClass3(Param1Value, Param2Value, Param3Value, Param4Value, Param5Value, Param6Value, Param7Value, Param8Value, Param9Value, Param10Value) 
    End If 

End Sub 

....いくつかのコードで説明しようとパラメータを移入しましたよSubClassesへの呼び出し。言い換えれば、このようなことをしてください....

Dim MySuperClass as New BaseRequest(Param1Value, Param2Value, Param3Value, Param4Value, Param5Value, Param6Value, Param7Value, Param8Value, Param9Value, Param10Value) 

If CallClass1 Then 
    Dim sClass1 As SubClass1 

    sClass1 = MySuperClass 'This Downcasting doesn't work, which is my problem. 
End If 

If CallClass2 Then 
    Dim sClass2 As SubClass2 
    sClass2 = MySuperClass 'This Downcasting doesn't work, which is my problem. 
End If 

If CallClass3 Then 
    Dim sClass3 As SubClass3 
    sClass3 = MySuperClass 'This Downcasting doesn't work, which is my problem. 
End If 

わかりました。これを行う最善の方法は何ですか?

+0

コードの書式設定では、VBコメント文字はうまく処理されません。ちょうど別のもので終わり、それは文字列として扱われます。または、//を使用し、 ' –

+0

ありがとうございました。私はそれを知らなかった。 –

+0

'' //まだコンパイルされますが、フォーマッタは文字列リテラルではなくコメントとして扱われ、コメントに追加のアポストロフィー文字が含まれていても機能します –

答えて

1

現在の方法が最良の方法です。それを受け入れて進んでください。 MyBase.Newへの呼び出しは「冗長」ではありません—それぞれが何か別個のものと言いますが、それらがなければ、あなたが望む動作を得られません。フレームワーク自体でサブクラスのコンストラクタを見ると、同じように行われます。

3

ハーポが正しいです。

しかし、このような状況は、Factoryデザインパターンの候補に似ています。 オブジェクトの作成を別の[Factory]クラスにカプセル化して、戻り値の型がBaseRequestになるようにすることができます。このファクトリメソッドは、作成するオブジェクトの種類を判断し、返されたオブジェクトの種類を確認できます。例えば

Public Class BaseRequestFactory 

    Public Function CreateRequest(ByVal arg1 As Object,,,) As BaseRequest 
     If condition1 Then 
      Return New SubClass1(arg1,,,) 
     Else If condition2 Then 
      Return New SubClass2(arg1,,,) 
     Else 
      ''etc 
     End If 
    End Function 

End Class 

最後の1つです。おそらく実現しているように、多数のパラメータを持つメソッドを持つことは素晴らしい方法ではありません。代わりにget/setプロパティを使用することで逃げることができるかどうか、または別のクラスのインスタンスをコンストラクタのパラメータとして渡すことを検討してください。

0

あなたが継承を使用する場合、実際にパラメータを渡す代わりにはありません。しかし、あなたは構成を使うことがより適切であるかもしれません。基本クラスを具体的にし、他のクラスにパラメータとして渡してみてください。

関連する問題