2009-08-12 14 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の共有コンストラクタ、前に実行する必要があります、

Init A 
Init B 
B.G 

これは明らかに間違っであるあなたがSharedコンストラクタの影響を考慮していない場合であっても(関係なく、古いという。):

リンク出力は(ありません)でなければなりませんと言います出力は "1"と "2"が直接Mainで印刷されていません。

それに加えて、ページ自体が矛盾していると思います。ページの冒頭に記載されているルールは正しいです(「共有コンストラクタは、型から派生するすべての型がロードされる前に実行されます」、「ロード済み」は少し漠然としています)。 )派生クラスSharedコンストラクタが呼び出された場合、基本クラスSharedコンストラクタが呼び出されることが保証されているとは限りません。

0

私は同じ問題に苦しんでいた、といくつかのより深い研究といくつかの実験で、私は次の結論に達した:

共有コンストラクタは継承されず、同じクラスレベルでのみ火の共有方法と呼ばれていました。例えば

Calling Method From Derived 
Base Shared Constructor 
Derived Shared Constructor 
Derived Method 
Calling Method From Base 
Base Method 

しかし、実際には次の出力を生成します:

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 
Derived Shared Constructor 
Derived Method 
Calling Method From Base 
Base Shared Constructor 
Base Method 

それはそれほど明白ではありません。..私は同じ罠に巻き込まれた。私はそれが同じ問題につきまとう次のものを助けることを願っています。

関連する問題