我可以从委托的构造函数中将委托传递给抽象类的构造函数吗?

时间:2010-02-15 12:23:03

标签: vb.net constructor delegates

我有一个抽象类,需要委托才能运行。我将委托传递给构造函数。现在我有一个非默认构造函数,我需要从具体类调用抽象类的构造函数,这意味着我需要使用MyBase.New(...)。我在下面列出了一个简单的例子。

Public MustInherit Class BaseClass
    Public Delegate Sub WorkMethod()
    Private _Work As WorkMethod

    Public Sub New(ByVal Work As WorkMethod)
        Me._Work = WorkMethod
    End Sub
End Class

Public Class ConcreteClass
    Public Sub New()
        MyBase.New(AddressOf DoSomethingHere)
    End Sub

    Public Sub DoSomethingHere()
        'Do some work here
    End Sub
End Class

我试图这样做,但我不断收到以下错误:“在调用另一个构造函数时,对构造中的对象的隐式引用无效”。

我可以不做我上面要做的事吗?我最初在自己的setter方法中设置了委托。但后来我创建了一个欺骗性API,因为它确实需要一个方法才能正常工作。

3 个答案:

答案 0 :(得分:3)

有没有理由不在基类中指定抽象方法,并在具体类中实现它?这将是实现此类事情的正常方式。

如果由于其他原因需要委托,可以始终从基类中的抽象方法创建委托。

(还有一些时候,你在构造函数参数中无法访问Me / this会有点痛苦;我觉得你很痛苦,但我认为使用抽象方法是可能更适合你所描述的情况。)

答案 1 :(得分:3)

您无法传递属于ConcreteClass的内容,因为在调用基类的构造函数时,该对象仍在构建中。因此当时不能使用它。

向基础添加抽象方法听起来更合理。

答案 2 :(得分:1)

在基类构造函数中,只有对象的基类部分是完整的 - 它实际上只是一个BaseClass对象,直到ConcreteClass构造函数完成。因此,您将无法在基本ctor中调用DoSomethingHere。你不这样做,但编译器不知道,并且必须假设你会。

如果你把它变成一个静态函数(将ConcreteClass作为参数传入),它应该可以工作。