2009-03-13 6 views
0

Ich habe eine Basisklasse, die eine ziemlich große Anzahl von Parametern in seinem neuen Konstruktor enthält. Ich habe 7 Unterklassen, die die Super-Basisklasse erben. Meine Frage/Problem ist, alle Unterklassen verwenden die gleichen Werte für die meisten Parameter im neuen Konstruktor der Basisklasse und diese Unterklassen können nacheinander aufgerufen werden. Ich möchte die allgemeinen Werte für die Oberklasse auffüllen und dann diese für jede der Unterklassen verwenden, aber ich kann mir keinen guten Weg vorstellen, dies zu tun. Wenn ich herausfinden könnte, wie das geht, müsste ich nicht alle diese Parameter im MyBase.New-Aufruf für jede Unterklasse übergeben. Ich werde versuchen, mit einigem Code zu veranschaulichen ....VB.Net OOP Frage - Superklasse, MyBase.net und Konstruktor Parameter

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 

Ich mag würde die redundanten Anrufe loswerden zu „MyBase.New“ in jeder Unterklasse ist und die Parameter wie ich neue bis zu bevölkern die Aufrufe an die Unterklassen. Mit anderen Worten, machen Sie so etwas ....

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 

Ich hoffe, das ist verständlich. Was ist der beste Weg, dies zu tun?

+0

Die Codeformatierung behandelt das VB-Kommentarzeichen nicht gut. Beenden Sie einfach mit einem anderen und es wird es als eine Schnur behandeln. Oder benutze einfach // und lasse die ' –

+0

Danke weg. Das wusste ich nicht. –

+0

'' // wird noch kompiliert, der Formatierer wird behandelt als Kommentar und nicht als String-Literal, und es funktioniert auch, wenn der Kommentar zusätzliche Apostroph-Zeichen enthält –

Antwort

1

Ihre aktuelle Methode ist der beste Weg, dies zu tun. Sie sollten das akzeptieren und weitermachen. Die Anrufe bei MyBase.New sind nicht "redundant" sie sagen jeweils etwas anders, und ohne sie würden Sie nicht das Verhalten erhalten, das Sie wollen. Wenn Sie im Konstruktor selbst nach Unterklassenkonstruktoren suchen, werden Sie feststellen, dass dies auf die gleiche Weise geschieht.

3

Harpo ist korrekt.

Diese Situation klingt jedoch wie ein guter Kandidat für das Factory-Design-Muster. Sie könnten versuchen, die Objekterstellung in eine andere [Factory] -Klasse einzubetten, die den Rückgabetyp BaseRequest haben würde. Diese Factory-Methode könnte dann bestimmen, welcher Objekttyp erstellt werden soll, und Sie könnten dann den Typ des zurückgegebenen Objekts überprüfen. z.B.

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 

Eine letzte Sache; Wie Sie wahrscheinlich feststellen, ist die Verwendung von Methoden mit einer großen Anzahl von Parametern keine großartige Übung. Sehen Sie, ob Sie stattdessen get/set-Eigenschaften verwenden können, oder überlegen Sie sich, ob Sie eine Instanz einer anderen Klasse als Parameter an Ihren Konstruktor übergeben möchten.

0

Wenn Sie Vererbung verwenden, gibt es nicht wirklich eine Alternative zur Übergabe der Parameter. Sie könnten jedoch feststellen, dass die Verwendung von Kompositionen besser geeignet ist. Versuchen Sie, Ihre Basisklasse zu konkretisieren und als Parameter in die anderen Klassen zu übernehmen.