0

嗨,我正在探索在没有所有装饰访问方法的情况下实现类似访问者模式的方法。到目前为止,我发现我可以在 VB.NET 中使用 Option Strict Off,但它有一些副作用。我有一组继承自基类 Shape 的 Shape 类。假设我们有以下接受形状的类:

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
4

2 回答 2

0

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

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

于 2009-11-01T12:34:50.017 回答
0

关闭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”兼容。

于 2009-11-01T16:25:19.507 回答