我有一个抽象类,需要委托才能运行。我将委托传递给构造函数。现在我有一个非默认构造函数,我需要从具体类调用抽象类的构造函数,这意味着我需要使用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,因为它确实需要一个方法才能正常工作。
答案 0 :(得分:3)
有没有理由不在基类中指定抽象方法,并在具体类中实现它?这将是实现此类事情的正常方式。
如果由于其他原因需要委托,可以始终从基类中的抽象方法创建委托。
(还有一些时候,你在构造函数参数中无法访问Me
/ this
会有点痛苦;我觉得你很痛苦,但我认为使用抽象方法是可能更适合你所描述的情况。)
答案 1 :(得分:3)
您无法传递属于ConcreteClass
的内容,因为在调用基类的构造函数时,该对象仍在构建中。因此当时不能使用它。
向基础添加抽象方法听起来更合理。
答案 2 :(得分:1)
在基类构造函数中,只有对象的基类部分是完整的 - 它实际上只是一个BaseClass对象,直到ConcreteClass构造函数完成。因此,您将无法在基本ctor中调用DoSomethingHere。你不这样做,但编译器不知道,并且必须假设你会。
如果你把它变成一个静态函数(将ConcreteClass作为参数传入),它应该可以工作。