2010-11-11 66 views
0

無論如何,我希望這個問題是有道理的。我期待知道在VB.NET中,當我們調用對象的構造函數時,是否有某種引用指向調用者?在對象上調用New時,創建的對象是否可以引用它的調用者?

我,因爲我想要創建的目標,首先能夠驗證一些數據存在於呼叫,然後才允許本身要創建一個極端情況的興趣。如果驗證失敗,我打算拋出異常。除非正在創建的對象被程序員錯誤地使用,否則這個角落案例不會在運行時發生。正在創建的對象是不繼承我想它來驗證對象,所以我不能做的MyBase預選賽東西。

這是一個「面向未來的」的問題,我有做的(壞)習慣位。不重要 - 我可以隨時留下嚴厲的評論作爲最後的手段。想知道這是否可能。

回答

2

沒有內置參考主叫方,但主叫方可以傳遞到自身的引用作爲參數構造函數。

+0

我不這麼認爲,但想確定。我想我已經找到了解決我的問題的方法。我會在Ravens/Falcons比賽結束後發佈更多內容。 – Kumba 2010-11-12 01:28:28

+0

所以我做的是編碼一個「最大」值(我基本上建立靜態類來模仿.NET枚舉),並用它來檢查一個數組作爲構造函數中的第一項。如果數組不爲空,並且已經等於「最大」值,那麼我可以拋出異常。這個想法是枚舉是固定的,並且不會經常改變,所以使它們成爲編譯時的東西是明智的。當他們需要更新時,程序員(我現在)有責任添加新項目並增加「最大」值。這樣,在類之外添加的枚舉將始終失敗。 – Kumba 2010-11-13 05:54:52

0

您可以創建一個構造函數創建的對象作爲參數,然後使默認的構造函數私有,因此它不能被稱爲:

Public Class Example 

Private Sub New() 
End Sub 

Public Sub New(ByVal parent as object) 
'initialisation code 
End Sub 

End Class 

(道歉,如果語法是不是100%正確的)

1

有沒有辦法讓一個對象回頭參照它的調用者。可以指定'父對象'必須作爲參數傳入(如ChrisF所建議的那樣),但不能保證傳入的對象與實際的調用者有任何關係。但是,如果您的目標是將自己「附加」到某個對象,則此方法將確保您擁有要附加的有效對象。

一個有用的特技其可在VB.Net,但不是C#,是有其具有一些特定類型的字段的基類型,並設置該字段來在其構造傳遞的值。在VB.net中,在對基級構造函數的調用和構造函數中的下一個語句之間執行派生類型字段初始化。因此,可以這樣做:

 
Class ParamBase(Of T) 
    Protected BaseParam As T 
    Sub New(TheParam As T) 
    BaseParam = Param 
    End Sub 
End Class 

Class MyThing 
    Inherits ParamBase(Of MyThingParent) 

    ' Sample initialization 
    Dim MyTitle = BaseParam.Title ' Assuming MyThingParent has a title property 
    ' Other initializations can be done similarly 

    Sub New(MyParent As MyThingParent) 
    MyBase.New(MyParent) 
    ' Do remainder of constructor 
    End Sub 
End Class 

方便的小動作。

相關問題