Я пытаюсь реализовать шаблон проектирования Стратегии с использованием интерфейсов.
Однако при разработке кода я наткнулся на что-то странное.
Тип объекта не проверяется во время разработки.
Соблюдайте следующий код.
Обратите внимание, что 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.
Выход консоли:
* * 1010
Кто-нибудь может объяснить это поведение?