Vb.net 从带有参数的主类构造函数调用不带参数的驱动类构造函数
我有一个抽象基类和一个驱动类。基类有一些成员,我想根据derrive类类型设置这些成员。但是对于所有接受参数的驱动类,我也有一个公共构造函数。那个带有参数的公共构造函数正在重复我想要摆脱的代码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()
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我不明白你的意思,但我更新了我的答案,希望能澄清我想说的话。