私は、クラスが正しくインスタンス化されないと思います。また、クイックフィックスとして、サブクラス化していくつかのメソッドをシャドウして、プログラムを爆発することなく実行できるようにしました。私はソフトウェアを実行すると、メソッドの呼び出しは、サブクラスではなく、ベースの実装に解決されます。私は.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プロパティを使用して行います。
私は何か間違ったことをしているか間違った仮定をしていると確信していますが、何が分かりません。
おかげで、 ブライアンは
私はサブクラス化されたメソッドをシャドウではなくオーバーライドとして宣言し、超過可能なスーパークラスメソッドをそのまま保つ必要がありますか? –
とにかくそのトリックをした。ありがとう、相棒。 –
はい、サブクラスのメソッドを 'Overrides'として宣言してください。 –