メソッドの多態化について
- 題名: メソッドの多態化について
- 著者: nmls
- 日時: 2008/03/14 11:21:24
- ID: 21672
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: メソッドの多態化について
- 著者: まどか
- 日時: 2008/03/14 12:16:34
- ID: 21673
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: メソッドの多態化について
- 著者: nmls
- 日時: 2008/03/14 12:43:06
- ID: 21674
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
いつもお世話になっております。
本投稿は[仕様](やりたいこと)→[コード]→[質問]
という構成になっております。
現在、オブジェクト指向設計の勉強中で、
次のような仕様のクラスを作成しております。
[仕様]
1.Statusクラスは、ステータス値を変更するクラスである。
2.Statusを変更する際、「現在のステータス値」と「変更後のステータス値」によって
処理を多態化しなければならない。
3.変更時の基本的な処理は、Statusクラスに実装し、特別な処理は派生クラスにて
Overrideして実装する
[コード]
Public Class Status
#Region "メンバ"
Protected _StatusId As Short
#End Region
#Region "メソッド"
Public Overridable Sub ChangeTo(ByVal AfterStatus As Status01)
Debug.WriteLine("ステータス1からステータス1に変更する場合の基本的な処理")
End Sub
Public Overridable Sub ChangeTo(ByVal AfterStatus As Status02)
Debug.WriteLine("ステータス1からステータス2に変更する場合の基本的な処理")
End Sub
#End Region
End Class
Public Class Status01
Inherits Status
Sub New()
_StatusId = 1
End Sub
#Region "Overridesメソッド"
Public Overrides Sub ChangeTo(ByVal AfterStatus As Status02)
Debug.WriteLine("ステータス1からステータス2に変更する場合の特別な処理")
End Sub
#End Region
End Class
Public Class Status02
Inherits Status
Sub New()
_StatusId = 2
End Sub
#Region "Overridesメソッド"
Public Overrides Sub ChangeTo(ByVal AfterStatus As Status01)
Debug.WriteLine("ステータス2からステータス1に変更する場合の特別な処理")
End Sub
#End Region
End Class
[質問]
上記クラスに対し、次のようなテストを行いました。
Shared Sub Test1()
Dim objSTS1 As New Status01
objSTS1.ChangeTo(New Status01)
objSTS1.ChangeTo(New Status02)
Dim objSTS2 As New Status02
objSTS2.ChangeTo(New Status01)
objSTS2.ChangeTo(New Status02)
End Sub
結果は下記の通りで、「正常な動作」となっております。
ステータス1からステータス1に変更する場合の基本的な処理
ステータス1からステータス2に変更する場合の特別な処理
ステータス2からステータス1に変更する場合の特別な処理
ステータス1からステータス2に変更する場合の基本的な処理
ここでさらに、次のケースをテストしてみると、
Test3のケースで例外が発生してしまいました。
Shared Sub Test2()
Dim objAfterSTS As Object
Dim objBeforeSTS As New Status02
objAfterSTS = New Status01
objBeforeSTS.ChangeTo(objAfterSTS)
End Sub
Shared Sub Test3()
Dim objAfterSTS As Object
Dim objBeforeSTS As New Status02
objAfterSTS = New Status02
objBeforeSTS.ChangeTo(objAfterSTS)
End Sub
例外:Public Overrides Sub ChangeTo(AfterStatus As ChangeStatus_v11.Status01)' を引数
パラメータ 'AfterStatus' に対応する引数は、'Status02' から 'Status01' へ変換できません。
で呼び出せないため、メソッドの呼び出しに失敗しました。
Test2,Test3ともに遅延バインディングによる呼び出しなのに、
なぜTest3だけ例外が発生するのでしょうか・・・?
長々と恐縮ですが、ご教授のほどよろしくお願いいたします。