Почему интерфейсы не сильно типизированы? - PullRequest
4 голосов
/ 08 января 2010

У меня следующий код компилируется без проблем. Конечно, при выполнении Dim C As IDoThingsC = GetThing_C() я получаю недопустимое исключение приведения. Я что-то пропустил? Вы когда-нибудь захотите вернуть объект, который не соответствует требованию интерфейса для возвращаемого значения функции?

Public Class ClassA

  Public Sub DoThings_A()
    Debug.Print("Doing A things...")
  End Sub

End Class


Public Class ClassB
  Implements IDoThingsC

  Public Sub DoThings_B()
    Debug.Print("Doing B things...")
  End Sub

  Public Sub DoThings_C() Implements IDoThingsC.DoThings_C
    Debug.Print("Doing C things...")
  End Sub

End Class


Public Interface IDoThingsC

  Sub DoThings_C()

End Interface


Public Class aTest

  Public Sub Test()

    Dim C As IDoThingsC = GetThing_C()
    C.DoThings_C()

  End Sub


  Public Function GetThing_C() As IDoThingsC

    Dim Thing As ClassA = New ClassA
    Thing.DoThings_A()

    Return Thing

  End Function


End Class

Ответы [ 3 ]

13 голосов
/ 08 января 2010

Используйте Option Strict On вверху файла с исходным кодом, чтобы поймать подобные проблемы Вы получите ошибку времени компиляции вместо ошибки времени выполнения:

error BC30512: Option Strict On disallows implicit conversions from 'ClassA' to 'IDoThingsC'.
1 голос
/ 08 января 2010

взято с http://msdn.microsoft.com/en-us/library/h5fsszz9(VS.80).aspx

При преобразовании между типами данных, компилятор Visual Basic может работать под строгим или разрешительным типом семантика. Если строгая семантика типа в действительности только расширяются преобразования разрешены неявно, и сужение конверсий должно быть явный. Под разрешающим типом семантика, вы можете попробовать все расширяющиеся и сужающиеся конверсии неявно. Тип семантики применяется к преобразования между всеми типами данных, включая типы объектов.

0 голосов
/ 09 января 2010

Option Strict решит эту проблему. Но также «ClassA» не реализует интерфейс. Таким образом, переключение определения класса A на следующее решит вашу проблему:

Public Class ClassA
  Implements IDoThingsC

  Public Sub DoThings_A()
    Debug.Print("Doing A things...")
  End Sub

End Class
...