2010-12-30 16 views
0

私は、クラスが正しくインスタンス化されないと思います。また、クイックフィックスとして、サブクラス化していくつかのメソッドをシャドウして、プログラムを爆発することなく実行できるようにしました。私はソフトウェアを実行すると、メソッドの呼び出しは、サブクラスではなく、ベースの実装に解決されます。私は.NET 2.0でVB.NETを使用しています。ここに私がやろうとしていることの例があります:陰影付きメソッドが呼び出されていない

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メソッドが呼び出されます。オブジェクトへのアクセスはInstanceプロパティを使用して行います。

私は何か間違ったことをしているか間違った仮定をしていると確信していますが、何が分かりません。

おかげで、 ブライアンは

答えて

3

方法は影ではなく上書きされた場合、インスタンスは、サブクラス型である場合、シャドウイング方法が呼び出されません - 呼び出されるメソッドは、コンパイルに基づいて決定されますランタイムタイプではなくレシーバのリアルタイムタイプです。これはシャドーイングとオーバーライドの基本的な違いです。

+0

私はサブクラス化されたメソッドをシャドウではなくオーバーライドとして宣言し、超過可能なスーパークラスメソッドをそのまま保つ必要がありますか? –

+0

とにかくそのトリックをした。ありがとう、相棒。 –

+0

はい、サブクラスのメソッドを 'Overrides'として宣言してください。 –

関連する問題