在下面的language specification中给出,至少对我来说,调用Db.Foobar()[在下面的代码中]并没有真正调用基类的共享构造函数。我很好奇a)这是我自己做错事的错误还是b)这是语言规范中的错误
Public MustInherit Class D1
Shared Sub New()
Console.WriteLine("D1 Static Constructor Called")
End Sub
End Class
Public MustInherit Class D2
Inherits D1
End Class
Public Class Da
Inherits D2
Public Sub New()
Console.WriteLine("Public Da Constructor Called")
End Sub
End Class
Public Class Db
Inherits D2
Shared Sub New()
Console.WriteLine("Db Static Constructor Called")
End Sub
Public Sub New()
Console.WriteLine("Public Db Constructor Called")
End Sub
Public Shared Sub FooBar()
Console.WriteLine("FooBar Called")
End Sub
End Class
答案 0 :(得分:4)
VB.NET在实例化类或其派生类之前或在访问类本身的Shared
成员之前调用基类的共享构造函数。
从理论的角度来看,Shared
(static
)东西是面向对象语言中的非面向对象的东西(例如,它们不支持多态性。)没有必要调用访问派生类的静态成员时的基类Shared
构造函数。当涉及静态成员时,每个类都是完全独立的实体。
更新(重新评论):
它认为您指的是以下代码段:
相比之下,以下示例生成可预测的输出,因为类A的Shared构造函数必须在B类的Shared构造函数之前执行,该类构造函数派生自它:
Imports System
Module Test
Sub Main()
Console.WriteLine("1")
B.G()
Console.WriteLine("2")
End Sub
End Module
Class A
Shared Sub New()
Console.WriteLine("Init A")
End Sub
End Class
Class B
Inherits A
Shared Sub New()
Console.WriteLine("Init B")
End Sub
Public Shared Sub G()
Console.WriteLine("B.G")
End Sub
End Class
该链接表示输出应该是(不是):
Init A
Init B
B.G
这显然错误(无论是否旧)。即使您不考虑Shared
构造函数的含义,输出也没有“1”和“ 2“由Main
直接打印。
除此之外,我认为那页与自己相矛盾。在页面开头附近提到的规则是正确的(除了项目“在从类型派生的任何类型之前运行共享构造函数。”,其中“loaded”有点模糊。实例化是一个更正确的单词。 )没有规则说如果调用派生类Shared
构造函数,也保证调用基类Shared
构造函数。
答案 1 :(得分:0)
我正在努力解决同样的问题,通过一些更深入的研究和一些实验,我得出以下结论:
共享构造函数不可继承,只在与调用共享方法相同的类级别触发。
例如:
Public Class Base
Shared Sub New()
Console.WriteLine("Base Shared Constructor")
End Sub
Public Shared Sub BaseMethod()
Console.WriteLine("Base Method")
End Sub
End Class
Public Class Derived
Inherits Base
Shared Sub New()
Console.WriteLine("Derived Shared Constructor")
End Sub
Public Shared Sub DerivedMethod()
Console.WriteLine("Derived Method")
End Sub
End Class
Module Module1
Sub Main()
Console.WriteLine("Calling Method From Derived")
Derived.DerivedMethod()
Console.WriteLine("Calling Method From Base")
Derived.BaseMethod()
Console.Read()
End Sub
End Module
理想情况下会产生以下输出:
Calling Method From Derived
Base Shared Constructor
Derived Shared Constructor
Derived Method
Calling Method From Base
Base Method
但实际上会产生以下输出:
Calling Method From Derived
Derived Shared Constructor
Derived Method
Calling Method From Base
Base Shared Constructor
Base Method
这不是那么明显......我陷入了同样的陷阱。我希望它可以帮助下一个遇到同样问题的人。