Ограничение строгого выключения VB.NET - PullRequest
0 голосов
/ 01 ноября 2009

Привет, я изучаю способы реализации шаблонов Visitor одинаково без использования всех методов декорирования посещений. Софар Я узнал, что могу использовать Option Strict Off в VB.NET, но у него есть некоторые побочные эффекты У меня есть набор классов Shape, которые наследуются от Shape базового класса. Предположим, у нас есть следующий класс, который принимает формы Accept:

Public Class ShapeAcceptor 
    Public Sub New()
      MyBase.New
    End Sub
    Public Sub AcceptShape(s as Shape)
      AcceptAny(s)
    End sub
    Private Sub AcceptAny(o as Object)
      Accept(o)
    End sub

    Private Sub Accept(byval s as Shape)
      Console.writeLine("Shape")
    End Sub 
    Private Sub Accept(byval s as Square)
      Console.WriteLine("Square")
    End sub
    Private Sub Accept(byval s as Circle)
      Console.writeLine("Circle")
    End Sub
    Private Sub Accept(byval s as Triangle)
      Console.writeLine("Triangle")
    End Sub  
  End Class

Это работает, когда Option Explicit выключен. Однако программа, вызывающая метод AcceptShape с чем-то другим, компилируется, но дает исключение времени выполнения. Как мы можем превратить это в Ошибка компиляции?

Public Class Application
    Public Shared Sub Main()
      Dim acceptor as new ShapeAcceptor
      Dim env as new Envelope
      For Each s  as Shape in env.Items
        acceptor.AcceptShape(s)
      Next
      acceptor.AcceptShape(new NotAShape())
     End Sub
  End Class

Ответы [ 2 ]

0 голосов
/ 01 ноября 2009

Выключение Option Strict позволило вам сделать звонок с поздней привязкой Accept(o).

Чистое решение, которое также решает вашу проблему с ошибками во время выполнения, - это снова включить Option Strict и выполнить вызов с поздней привязкой вручную. Так что, в принципе, вы бы заменили

Public Sub AcceptShape(s as Shape)
  AcceptAny(s)
End Sub
Private Sub AcceptAny(o as Object)
  Accept(o)
End Sub

с

Public Sub AcceptShape(s as Shape)
  GetType(ShapeAcceptor).InvokeMember("Accept", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, Me, new Object() {s})
End Sub

(Подробнее см. Документацию Type.InvokeMember . Вам потребуется Imports System.Reflection для BindingFlags.)

Это в основном делает то же, что и ваш Accept (o), за исключением того, что он "Option Strict" -совместим.

0 голосов
/ 01 ноября 2009

Когда вы устанавливаете для класса Option Strict Off, вы говорите компилятору разрешить позднее связывание для этого класса, что, скорее всего, не очень хорошая идея.

Что вам, вероятно, следует сделать, это изменить его на Option Strict On, чтобы вы получили ошибки компиляции, и впоследствии вы перестанете получать исключения во время выполнения, потому что он перехватит неверный параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...