共享方法不调用共享构造函数

时间:2009-08-12 22:50:05

标签: vb.net

在下面的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

2 个答案:

答案 0 :(得分:4)

VB.NET在实例化类或其派生类之前或在访问类本身的Shared成员之前调用基类的共享构造函数。

从理论的角度来看,Sharedstatic)东西是面向对象语言中的非面向对象的东西(例如,它们不支持多态性。)没有必要调用访问派生类的静态成员时的基类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

这不是那么明显......我陷入了同样的陷阱。我希望它可以帮助下一个遇到同样问题的人。