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

问题描述:

我有一个抽象类,它需要一个委托功能。我将委托传递给构造函数。现在我有一个非默认构造函数,我需要从具体类调用抽象类的构造函数,这意味着我需要使用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,因为它确实需要一个方法才能正常工作。

你不能传递属于ConcreteClass的东西,因为当调用基类的构造函数时该对象仍在构造中。因此当时不能使用它。

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

而不是采取委托,有什么理由不在基类中指定抽象方法,并在具体类中实现它?这将是实现这种事情的正常方式。

如果因为其他原因需要委托,可以始终使用基类中的抽象方法创建它。 (还有其他一些时候,在构造函数参数中不能访问Me/this有点痛苦;我在这里感觉到你的痛苦,但我认为使用抽象方法可能更适合这种情况你已经描述过了。)

+0

我一直在这太久。这就是我应该如何去做的。我不知道为什么我没有想到它。抱歉浪费大家的时间。什么是初学者犯的错误。 – uriDium 2010-02-15 12:37:19

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

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