Вопрос ООБ VB.Net - Параметры суперкласса, MyBase.net и конструктора - PullRequest
0 голосов
/ 13 марта 2009

У меня есть базовый класс, который содержит довольно большое количество параметров в своем конструкторе New. У меня есть 7 подклассов, которые наследуют базовый класс Super. Мой вопрос / проблема заключается в том, что все подклассы используют одни и те же значения для большинства параметров в конструкторе New базового класса, и эти подклассы можно вызывать один за другим. Я хотел бы заполнить общие значения для суперкласса и затем использовать их для каждого из подклассов, но я не могу придумать хороший способ сделать это. Если бы я мог понять, как это сделать, мне не пришлось бы передавать все эти параметры в вызове MyBase.New для каждого подкласса. Я попытаюсь проиллюстрировать это с помощью некоторого кода ....

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

Я хотел бы избавиться от избыточных вызовов «MyBase.New» в каждом подклассе и необходимости заполнять параметры при вводе новых вызовов в подклассы. Другими словами, сделайте что-то вроде этого ...

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

Надеюсь, это понятно. Какой лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 13 марта 2009

Гарпо верна.

Однако эта ситуация звучит как хороший кандидат на шаблон проектирования фабрики. Вы можете попробовать инкапсулировать создание объекта в другой класс [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

И последнее. как вы, вероятно, понимаете, использование методов с большим количеством параметров не является хорошей практикой. Посмотрите, сможете ли вы вместо этого использовать свойства get / set, или можете рассмотреть возможность передачи экземпляра другого класса в качестве параметра вашему конструктору.

1 голос
/ 13 марта 2009

Ваш текущий метод - лучший способ сделать это. Вы должны принять это и двигаться дальше. Вызовы MyBase.New не являются «лишними» - каждый из них говорит что-то свое, и без них вы не получите желаемого поведения. Если вы посмотрите на конструкторы подклассов в самой структуре, то обнаружите, что это делается точно так же.

0 голосов
/ 13 марта 2009

Если вы используете наследование, на самом деле альтернативы передаче параметров нет. Однако вы можете обнаружить, что использование композиции более уместно. Попробуйте сделать конкретный базовый класс и передать его в другие классы в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...