Затененный метод не вызывается - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть класс, который, как я понял, не всегда будет корректно создаваться, и, как быстрое решение, я решил подклассировать его и скрыть несколько методов, чтобы программа могла продолжать работать без взрыва.Когда я запускаю программное обеспечение, вызовы методов разрешают реализации базы, а не подкласс.Я использую VB.NET с .NET 2.0.Вот пример того, что я пытаюсь сделать:

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

Я не уверен, почему базовый класс вызывается во время выполнения.Когда я проверяю объект в отладчике, это явно тип SubClass, но вызываются методы SuperClass.Доступ к объекту осуществляется через свойство экземпляра.

Я уверен, что делаю что-то не так или делаю неправильное предположение, но не могу понять, что именно.

Спасибо, Брайан

1 Ответ

3 голосов
/ 30 декабря 2010

Если метод затенен, а не переопределен, методы затенения не будут вызываться, когда экземпляр имеет тип подкласса - метод, который будет вызываться, определяется на основе типа получателя времени компиляции, а не выполнения тип времени В этом принципиальная разница между затенением и переопределением.

...