DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メソッドの多態化について

環境/言語:[VB.NET(2.0)]
分類:[.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だけ例外が発生するのでしょうか・・・?
長々と恐縮ですが、ご教授のほどよろしくお願いいたします。
■No21672に返信(nmlsさんの記事)
> Public Class Status
>
> Public Overridable Sub ChangeTo(ByVal AfterStatus As Status01)
>
> End Class
>
> Public Class Status01
> Inherits Status
>
> End Class

まず根本の問題として、基底クラス(Status)が派生先クラス(Status01)を参照(依存)しています。
これはありえません。
基底クラスとは自己完結しており、派生クラスの存在など知る由もありません。

#↑があるのですべてに目を通していません。
まどかさん、早速のご回答ありがとうございます。

> まず根本の問題として、基底クラス(Status)が派生先クラス(Status01)を参照(依存)しています。
> これはありえません。
> 基底クラスとは自己完結しており、派生クラスの存在など知る由もありません。
仰る通りです。納得いたしました。
改めて考え直すことにします。

間抜けでスイマセン…
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板