2009-08-12 89 views
1

在下面的language specification中给出,至少对我来说,调用Db.Foobar()[在下面的代码中]确实没有调用基类的共享构造函数。我很好奇,一)这是我自己的错,为做错事或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 

回答

4

VB.NET不调用基类的构造函数共享一个错误之前实例的类或其派生类或访问类本身的成员Shared

从理论上来看,Sharedstatic)的东西都是非面向对象的东西,在面向对象语言(例如不支持多态。)没有必要调用基类Shared构造,当你访问派生类的静态成员。当谈到静态成员时,每个类都是一个完全独立的实体。

UPDATE(再评论):

它想你指的是下面的代码片段:

相比之下,下面的例子会产生可预测的输出,因为该类的共享构造

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 
:用于类B的共用构造,其中提炼出来之前A必须执行

这种联系说,输出应为(不):

Init A 
Init B 
B.G 

这是显然错了(无论是旧的),即使你不考虑Shared构造的影响时,输出不具有由Main直接打印的“1”和“2”。

除此之外,我认为该页面自相矛盾。在页面开头附近提到的规则是正确的(除了“共享构造函数在从类型派生的任何类型被加载之前运行”的项目之外,其中“加载”有点模糊,实例化在这里是更加正确的单词。 )没有规则说如果调用派生类Shared构造函数,基类Shared构造函数保证也被调用。

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 

它不是那么明显了..我陷入了同一陷阱。我希望它能帮助那些偶然遇到同样问题的人。