Вызовите конструктор класса без аргументов из конструктора основного класса с аргументами - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть абстрактный базовый класс и класс Derrived.В базовом классе есть некоторые члены, которые я хочу установить на основе типа класса Derrived.Но у меня также есть общий конструктор для всех наследуемых классов, которые принимают аргумент.Этот общий конструктор с аргументом является повторяющимся кодом, от которого я хотел бы избавиться.

Public MustInherit Class B
    Protected member1 As String
    Protected member2 As String
End Class

Public Class D1 : Inherits B
    Public Sub New()
        Me.member1 = "D1" ' individual code here
    End Sub

    Public Sub New(arg As String)
        Me.New()
        Me.meber2 = arg ' repeating code here, should be moved to base class
    End Sub
End Class

Public Class D2 : Inherits B
    Public Sub New()
        Me.member1 = "D2" ' individual code here
    End Sub

    Public Sub New(arg As String)
        Me.New()
        Me.meber2 = arg ' repeating code here, should be moved to base class
    End Sub
End Class

Как я могу реорганизовать это так, чтобы вызываемый конструктор без аргументов вызывался даже при вызове конструктора с аргументомв базовом классе?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Ваш код даже не скомпилируется, так как участник является Личным.У вас может быть защищенный метод, который заполняет член.

Public MustInherit Class B
    Private member1 As String
    Private member2 As String

    Protected Sub SetMembers(ByVal m1 As String, ByVal m2 As String)
        member1 = m1
        member2 = m2
    End Sub

End Class

Public Class D1 : Inherits B
    Public Sub New()
        Me.New("")
    End Sub

    Public Sub New(arg As String)
        SetMembers("D1", arg)
    End Sub
End Class

Public Class D2 : Inherits B
    Public Sub New()
        Me.New("")
    End Sub

    Public Sub New(arg As String)
        SetMembers("D2", arg)
    End Sub
End Class

Вы можете изменить SetMembers на защищенный New и вызвать его с MyBase.New (..., ...), если хотите.

1 голос
/ 09 апреля 2019

Почему бы не добавить конструктор в базовый класс?

Public MustInherit Class B
    Public Sub New(arg As String)
        Me.member2 = arg
    End Sub

    Protected member1 As String
    Protected member2 As String
End Class

Public Class D1 : Inherits B
    Public Sub New(arg As String)
        MyBase.New(arg)
        Me.member1 = "D1"
    End Sub
End Class

Public Class D2 : Inherits B
    Public Sub New(arg As String)
        MyBase.New(arg)
        Me.member1 = "D2"
    End Sub
End Class

На самом деле это не уменьшает дублирование, так как каждый производный класс все еще имеет строку, которая вызывает базовый конструктор, передавая егозначение, но оно позволяет вам централизованно поддерживать то, что оно делает с этим значением, и заставляет все производные классы делать это.Таким образом, вы никогда не сможете создать производный класс, в котором вы забудете предоставить это значение.

На самом деле, если вы хотите, чтобы все производные классы предоставили значение по умолчанию для member1, вы можете добавить это как параметр в базовый конструктор:

Public MustInherit Class B
    Public Sub New(member1 As String, member2 As String)
        Me.member1 = member1
        Me.member2 = member2
    End Sub

    Private member1 As String
    Private member2 As String
End Class

Public Class D1 : Inherits B
    Public Sub New(arg As String)
        MyBase.New("D1", arg)
    End Sub
End Class

Public Class D2 : Inherits B
    Public Sub New(arg As String)
        MyBase.New("D2", arg)
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...