Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从带有参数的主类构造函数调用不带参数的驱动类构造函数_Vb.net_Class_Constructor - Fatal编程技术网

Vb.net 从带有参数的主类构造函数调用不带参数的驱动类构造函数

Vb.net 从带有参数的主类构造函数调用不带参数的驱动类构造函数,vb.net,class,constructor,Vb.net,Class,Constructor,我有一个抽象基类和一个驱动类。基类有一些成员,我想根据derrive类类型设置这些成员。但是对于所有接受参数的驱动类,我也有一个公共构造函数。那个带有参数的公共构造函数正在重复我想要摆脱的代码 Public MustInherit Class B Protected member1 As String Protected member2 As String End Class Public Class D1 : Inherits B Public Sub New()

我有一个抽象基类和一个驱动类。基类有一些成员,我想根据derrive类类型设置这些成员。但是对于所有接受参数的驱动类,我也有一个公共构造函数。那个带有参数的公共构造函数正在重复我想要摆脱的代码

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

我如何重构它,以便调用不带参数的派生构造函数,即使在基类中调用带参数的构造函数时也是如此?

为什么不向基类添加构造函数

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

为什么不在基类中添加构造函数呢

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

您的代码甚至无法编译,因为成员是私有的。您可以有一个受保护的方法来填充成员

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(…,…)调用它。

您的代码甚至无法编译,因为该成员是私有的。您可以有一个受保护的方法来填充成员

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(…,…)调用它。

使用argument@FalcoGer我不明白你的意思,但是我更新了我的答案,希望能澄清我想说的内容argument@FalcoGer我不明白你的意思,但我更新了我的答案,希望能澄清我想说的话。