1
私は、インターフェイスを使用して戦略デザインパターンを実装しようとしています。 しかし、いくつかのコードを開発しているうちに、私は奇妙なことに遭遇しました。 オブジェクトの型は設計時に検証されません。インターフェイスでの.NETタイプのチェック
次のコードを確認してください。 FooはIFooを実装しており、Barはこのインターフェイスを実装していません。 これをしようとしたときにエラーが表示されません:
Dim fb2 As FooBar = New FooBar(bar)
完全なコードを:
Module Module1
Sub Main()
Try
Dim foo As Foo = New Foo()
Dim bar As Bar = New Bar()
Dim fb1 As FooBar = New FooBar(foo)
fb1.DoIt()
Dim fb2 As FooBar = New FooBar(bar)
fb2.DoIt()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Console.ReadLine()
End Sub
End Module
Public Class FooBar
Private _f As IFoo
Public Sub New(ByVal f As IFoo)
_f = f
End Sub
Public Sub DoIt()
_f.DoSomething()
End Sub
End Class
Public Interface IFoo
Sub DoSomething()
End Interface
Public Class Foo
Implements IFoo
Public Sub DoSomething() Implements IFoo.DoSomething
Console.WriteLine("DoSomething() called in Foo")
End Sub
End Class
Public Class Bar
Public Sub DoSomething()
Console.WriteLine("DoSomething() called in Bar")
End Sub
End Class
このコードは罰金コンパイルします。 Visual Studioにエラーは表示されません。 しかし、このコードを実行すると、InvalidCastExceptionが返されます。 コンソールの出力:
DoSomething() called in Foo
Unable to cast object of type 'InterfaceTest.Bar' to type 'InterfaceTest.IFoo'.
誰でもこの動作を説明できますか?
[Option Strict](http://msdn.microsoft.com/en-us/library/zcd4xwzs%28v=VS.100%29.aspx)を既定でオンにする必要があります。 –
ええと...私は遅くする方法を入力します – Jay
私は今、愚かな感じ、感謝:) – Hemario