0

こんにちは、訪問メソッドを装飾することなく、訪問者パターンを同様に実装する方法を模索しています。私は VB.NET で Option Strict Off を使用できることを知りましたが、いくつかの副作用があります。基本クラスの 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
4

2 に答える 2

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ます。)

これは、「Option Strict」と互換性があることを除いて、Accept(o)と基本的に同じです。

于 2009-11-01T16:25:19.507 に答える
0

クラスを Option Strict Off に設定すると、そのクラスで遅延バインディングを許可するようにコンパイラに指示することになりますが、これはおそらく良い考えではありません。

おそらく行うべきことは、それを Option Strict On に変更してコンパイル エラーが発生するようにすることです。その後、間違ったパラメーターをキャッチするため、ランタイム例外の発生を停止します。

于 2009-11-01T12:34:50.017 に答える