2009-08-12 11 views
1

Gegeben im folgenden language specification, zumindest für mich Aufruf von Db.Foobar() [Im folgenden Code] nicht tatsächlich auf die Shared Constructors der Basisklassen abzurufen. Ich bin neugierig, a) das ist meine eigene Schuld für etwas falsch oder b) tun, ist dies ein Fehler in der SprachspezifikationShared Method nicht aufgerufen Freigegebener Konstruktor

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 

Antwort

4

VB.NET Aufruf der Basisklasse tut Shared Konstruktor vor Instanziieren die Klasse oder ihre abgeleiteten Klassen oder bei Zugriffen auf Shared Mitglieder der Klasse selbst.

Aus theoretischer Sicht Shared (static) Sachen sind nicht objektorientierte Sachen in einer objektorientierten Sprache (zB sie nicht unterstützen Polymorphismus.) Gibt es keine Notwendigkeit, die Basisklasse Shared Konstruktor, wenn Sie Zugang zu rufen statische Mitglieder einer abgeleiteten Klasse. Jede Klasse ist eine vollständig separate Entität, wenn es um statische Member geht.

UPDATE (re Kommentar):

Es denken Sie an den folgenden Codeausschnitt beziehen:

Im Gegensatz dazu erzeugt das folgende Beispiel vorhersehbare Leistung, da Shared Konstruktor für die Klasse A muss ausgeführt werden, bevor der Gemeinschafts-Konstruktor für die Klasse B, die sich daraus ergibt:

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 

Dieser Zusammenhang sagt der ausgegeben werden soll (was nicht der Fall ist): Auch

Init A 
Init B 
B.G 

diese deutlich falsch (., Unabhängig davon, zu sein alt) ist, wenn man die Auswirkungen des Shared Konstruktor nicht berücksichtigen, die Ausgang hat nicht "1" und "2" direkt von Main gedruckt.

Abgesehen davon, ich denke diese Seite widerspricht sich. Die Regeln, die am Anfang der Seite erwähnt werden, sind korrekt (außer dem Punkt "Shared Constructors werden ausgeführt, bevor alle Typen, die vom Typ abgeleitet sind, geladen werden."), Wobei "loaded" etwas vage ist. Instanziiert ist hier ein korrekteres Wort.) Keine der Regeln sagt, wenn die abgeleitete Klasse Shared Konstruktor aufgerufen wird, wird die Basisklasse Shared Konstruktor garantiert auch aufgerufen werden.

0

ich mit dem gleichen Problem zu kämpfen hatte, und mit etwas tieferen Forschung und einigen Experimenten kam ich zu folgendem Ergebnis:

Geteilt Constructors nicht vererbbar sind, und nur das Feuer auf der gleichen Klassenstufe, die das Verfahren geteilt hieß.

Zum Beispiel:

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 

Idealerweise würde erzeugen die folgende Ausgabe:

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

Aber in der Tat die folgende Ausgabe erzeugt:

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

Es ist nicht so offensichtlich .. Ich war in derselben Falle gefangen. Ich hoffe, dass es den nächsten hilft, die über das gleiche Problem stolpern.

Verwandte Themen