代码之家  ›  专栏  ›  技术社区  ›  Hans Kruse

限制严格关闭VB.NET版

  •  0
  • Hans Kruse  · 技术社区  · 16 年前

    嗨,我正在探索如何实现一些访客模式,而不是所有的装饰访问方法。现在我发现我可以用严格的选项VB.NET版但也有一些副作用。我有一组从基类形状继承的形状类。假设我们有以下接受形状的类:

    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
    

    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 回复  |  直到 16 年前
        1
  •  0
  •   Joseph    16 年前

    当您将类设置为Option Strict Off时,就是告诉编译器允许对该类进行后期绑定,这很可能不是一个好主意。

    您应该做的是将其更改为Option Strict On,这样您就可以得到编译错误,然后您将停止获取运行时异常,因为它将捕获不正确的参数。

        2
  •  0
  •   Heinzi    16 年前

    转弯 Option Strict 关允许你打晚点的电话 Accept(o) .

    选项严格

    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 .)