我想创建用最少的代码重复的有效类。链接重载构造
我已经此定义:
Public Class Foo
Private _firstName as string = ""
Private _lastName as string = ""
Public Sub New(ByVal userGUID As Guid)
'query DB to get firstName and lastName
Me.New(dt.Rows(0)("FirstName").ToString(),dt.Rows(0)("LastName").ToString())
End Sub
Public Sub New(ByVal firstName As String, ByVal lastName As String)
_firstName = firstName.toUpper()
_lastName = lastName.toUpper()
Validate()
End Sub
Private Sub Validate()
' Throw error if something is wrong
End Sub
End Class
的构造与firstName和lastName参数是终点的构造,做验证。将userGUID作为参数的构造函数将查询DB以获取名称并调用最终的构造函数。通过这种方式,所有的执行都应该指向实际执行所有验证等的构造函数之一。其背后的想法是,如果我添加新的构造函数,我只需要提取必要的数据(名字/姓氏)并调用最终的构造函数即可做验证。
然而,有一个编译错误阻止我使用在线Me.New(dt.Rows(0)("FirstName").ToString(),dt.Rows(0)("LastName").ToString())
这个系统。显然这条线必须是构造函数中的第一行。但是,如果我将此作为第一行,它将打破验证过程,因为验证将因没有名/姓而引发错误。我必须查询数据库才能获取该信息。
我知道我可以在这里指定的值,并从这个构造函数调用过验证,但是这将有效地从最终一个隔离此构造,从而复制代码,并增加维护了一下。仅供参考,在下面的例子中,我只有2个构造函数,但实际上我还有几个构造函数。如果每个人都能完成自己的任务,那么只需要多加维护。
那么,有没有办法实现通过执行一些代码,然后调用一个重载的构造我的任务是什么?
谢谢你的任何见解
更新1:
每the_lotus评论,我包括DT定义。这个问题有一个解决方法。基本上我会从最终的构造函数中进行验证和赋值,并将其放入函数中。所有的构造函数都会调用这个函数,从而消除链构造函数的需要。它看起来不错,但我想明白为什么要链构造函数,我必须将构造函数调用放在第一行。
这里是新代码:
公共类Foo 私人_FirstName作为字符串= “” 私人_lastName作为字符串= “”
Public Sub New(ByVal userGUID As Guid)
Dim dt As New DataTable
' query DB to get firstName and lastName
' Assume I populate dt with at least one DataRow
AssignAndValidate(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
'Me.New(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
End Sub
Public Sub New(ByVal firstName As String, ByVal lastName As String)
AssignAndValidate(firstName, lastName)
End Sub
Private Sub Validate()
' Throw error if something is wrong
End Sub
Private Sub AssignAndValidate(ByVal firstName As String, ByVal lastName As String)
_firstName = firstName.ToUpper()
_lastName = lastName.ToUpper()
Validate()
End Sub
末级
一个好奇更不用说:在线代码转换器(vb.net到C#)没有问题转换链接的构造函数调用不在第一行。 C#代码返回为this.#ctor(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString());
但是,如果我尝试转换回VB.NET,它将失败。
你没有显示dt从哪里来。你可以有私有的Initialize方法或者有一个共享的工厂方法。 –
dt在这里不是问题。这就是为什么我包含'查询数据库获取名字和姓氏'代码...我试图保持代码简短。假设我将dt定义为DataTable并查询数据库以获取值。还假设我至少得到一行数据和值。问题出在Me.New上,编译器想把它放在构造函数的第一行。我将用dt更新我的答案定义 – George
是的,您需要有构造函数重载调用遵循您的构造函数声明 - 这是规则。然后,从那里设计你的物体,而不是其他方式。 –