2009-11-01 60 views
0

嗨我正在探索如何实现一些访客模式,但没有所有的装饰访问方法。 Sofar我发现我可以在VB.NET中使用Option Strict Off,但它有一些副作用。我有一组Shape类继承自基类Shape。假设我们有以下类,接受的形状:严格限制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 

这适用于选项显式关闭时。然而,调用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 

回答

0

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

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

0

车削Option Strict off允许您进行迟到的呼叫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.ReflectionBindingFlags。)

这基本上做同样的你的Accept(o)做了什么,除了它是“Option Strict”兼容的。