2012-01-06 1 views
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'. 

Может кто-нибудь объяснить такое поведение?

+0

Вы должны установить [Option Strict] (http://msdn.microsoft.com/en-us/library/zcd4xwzs%28v=VS.100%29.aspx) По умолчанию! –

+0

Да, это ... Я печатаю способ замедлить – Jay

+0

Теперь я чувствую себя глупо, спасибо :) – Hemario

ответ