我想創建用最少的代碼重複的有效類。鏈接重載構造
我已經此定義:
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
是的,您需要有構造函數重載調用遵循您的構造函數聲明 - 這是規則。然後,從那裏設計你的物體,而不是其他方式。 –