2009-11-01 9 views
0

Salut, je suis en train d'explorer des façons de mettre en œuvre quelque chose Visitor Patterns sans toutes les méthodes de visite de décoration. Sofar J'ai découvert que je pourrais utiliser Option Strict Off dans VB.NET mais il a quelques effets secondaires. J'ai un ensemble de classes Shape qui héritent d'une forme de baseclass. Supposons que nous avons la classe suivante qui acceptent les formes pour:Limiter strict off 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 

Cela fonctionne lorsque l'option explicite est désactivée. Cependant, un programme appelant la méthode AcceptShape avec quelque chose d'autre compile mais donne une exception d'exécution. Comment pouvons-nous transformer cela en erreur compiletime?

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 

Répondre

0

Lorsque vous définissez la classe Option Strict Off vous indiquez au compilateur pour permettre la liaison tardive sur cette classe, ce qui est très probablement pas une bonne idée. Ce que vous devriez probablement faire est de le changer en Option Strict On afin que vous obteniez les erreurs de compilation, et par la suite vous cesserez d'obtenir des exceptions d'exécution car il attrapera le paramètre incorrect.

0

L'activation de Option Strict off vous a permis d'effectuer l'appel de liaison tardive Accept(o).

La solution propre, qui résout également votre problème d'erreur d'exécution, consiste à réactiver Option Strict et à effectuer l'appel tardif manuellement. Donc, en gros, vous devez remplacer

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

avec

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 

(Voir la documentation de Type.InvokeMember pour plus de détails. Vous aurez besoin Imports System.Reflection pour le BindingFlags.)

Cela ne fondamentalement la même ce que votre Accept (o) a fait, sauf que c'est "Option Strict" compatible.