2010-12-30 11 views
0

Ich habe eine Klasse, die ich nicht immer korrekt instanziieren und als eine schnelle Lösung, ich dachte, ich würde Unterklasse und Schatten ein paar Methoden, so dass das Programm weiterhin ausgeführt werden kann, ohne zu explodieren. Wenn ich die Software starte, werden Aufrufe an die Methoden in die Implementierungen der Basis und nicht in die Unterklasse aufgelöst. Ich benutze VB.NET mit .NET 2.0. Hier ist ein Beispiel dafür, was ich versuche zu tun:Shadowed-Methode heißt nicht

Public Class SuperClass 

    Public Sub New() 
    Dim type As Type = GetType(SubClass) 
    If (Me.GetType() is type) Then 
     //nothing 
    Else 
     //build real object 
    EndIf 
    End Sub 

    Private Shared _Instance As SuperClass 
    Public Shared ReadOnly Property Instance() As SuperClass 
    Get 
     If (_Instance Is Nothing) Then 
     Try 
      _Instance = New SuperClass() 
     Catch ex As Exception 
      Dim result As DialogResult = MessageBox.Show(text, caption, MessageBoxButtons.RetryCancel, MessageBoxIcon.Information) 
      If (result = DialogResult.Retry) Then 
      _Instance = New SuperClass() 
      //this will probably cause problems of its own, but i'll cross that bridge later... 
      Else 
      _Instance = New SubClass() 
      End If 
     End Try 

     End If 
     Return _Instance 
    End Get 
    End Property 

    Public Overridable Function MyFunction() As Integer 
    Dim somethingReasonable As Integer //do something for real 
    Return somethingReasonable 
    End Function 

End Class 

Public Class SubClass 
    Inherits SuperClass 

    Public Sub New() 
    //doesn't do what cause the exception in the first place 
    End Sub 

    Public Shadows Function MyFunction() As Integer 
    //Do something safe 
    Return -1 
    End Function  

End Class 

Ich bin nicht sicher, warum die Basisklasse während der Laufzeit aufgerufen wird. Wenn ich das Objekt im Debugger inspiziere, ist es eindeutig der SubClass-Typ, aber die SuperClass-Methoden werden aufgerufen. Der Zugriff auf das Objekt erfolgt über die Instance-Eigenschaft.

Ich bin mir sicher, dass ich etwas falsch mache oder falsche Annahmen mache, aber ich kann nicht herausfinden, was.

Danke, brian

Antwort

3

Wenn eine Methode als überschriebene eher beschattet wird, werden die Schatten Methoden nicht aufgerufen werden, wenn eine Instanz der Unterklasse-Typ ist - das Verfahren, das auf der Basis compile- bestimmt aufgerufen wird, wird Zeittyp des Empfängers anstelle des Laufzeittyps. Dies ist der fundamentale Unterschied zwischen Shadowing und Overriding.

+0

Also sollte ich die subclasse Methode als Overrides und nicht als Schatten deklarieren und die übersteuerbaren Super Klassen Methoden so behalten wie sie sind? –

+0

naja, eh das hat den Trick gemacht. Danke, Alter. –

+0

Ja, deklarieren Sie die Unterklassenmethode als 'Overrides'. –