在对象上调用New时,正在创建的对象是否可以返回其调用者?

时间:2010-11-11 21:16:59

标签: vb.net

无论如何,我希望这个问题有道理。我想知道在VB.NET中,当我们调用一个对象的构造函数时,是否有某种引用指向调用者?

我很感兴趣,因为我希望创建的对象首先能够在允许自己创建之前验证调用者中是否存在某些数据。如果此验证失败,我计划抛出异常。除非正在创建的对象被程序员不正确地使用,否则这种极端情况将永远不会在运行时发生。正在创建的对象继承我想要验证的对象,因此我无法对MyBase限定符执行任何操作。

这是一个“面向未来”的问题,我有一个(坏)做的习惯。并不重要 - 作为最后的手段,我总是可以留下严厉的评论。想知道这是否可能。

3 个答案:

答案 0 :(得分:2)

没有对调用者的内置引用,但调用者可以将对自身的引用作为参数传递给构造函数。

答案 1 :(得分: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

方便的小技巧。

答案 2 :(得分:0)

您可以创建一个构造函数,将创建对象作为参数,然后将默认构造函数设为私有,以便不能调用它:

Public Class Example

Private Sub New() 
End Sub 

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

End Class 

(如果语法不是100%正确,则道歉)