2009-05-19 23 views
3

これで、イベントを宣言する基本クラスがあります。StatusTextChangedです。私の子クラスはもちろん、このイベントを直接呼び出すことはできません。基本クラスのイベント

だから私は、この(単純化のために)のようなもので羽目になる:

Public MustInherit Class FooBase 
    Public Event StatusTextChanged(ByVal StatusText As String) 
    Protected Sub RaiseStatusTextChangedEvent(ByVal StatusText As String) 
     RaiseEvent StatusTextChanged(StatusText) 
    End Sub 
End Class 

そして、子クラスで私が MyBase.RaiseStatusTextChangedEvent("something")を呼び出します。 これを行うには、より良い方法またはより良い方法がありますか?

編集:VB.NETまたはC#、どちらでも基本的に同じです。

編集:だから応答の後、私はあなたの子供のための具体的な必要性がある場合を除き、その後ちょうど...子クラスで

Public Event StatusTextChanged(ByVal StatusText As String) 
    Private _StatusText As String = "Idle." 
    Public Property StatusText() As String 
     Get 
      Return _StatusText 
     End Get 
     Protected Set(ByVal value As String) 
      RaiseEvent StatusTextChanged(value) 
     End Set 
    End Property 
+0

のパラメータのための私のコードです。 System.Windows.Forms.TextBoxを見ると、この目的のために多くの保護された仮想メソッド(OnTextChangedなど)が表示されます。 –

+0

オーバーライド可能なビットは完全にオプションです.cの動作を変更する必要がある場合にのみ必要ですサブクラス。 –

+0

あなたのサンプルコードに欠落している行がありますが、それ自体は問題を発生させるイベントに関しては重要ではありませんが、完全性のためにおそらく "_StatusText = value"を " (StringとしてのByVal値) "行を設定します。実際には、状況テキストが*実際に変更されていない限りStatusTextChangedイベントが発生しないようにするために、If値<> _StatusText Thenなどですべてをラップすることもできます。 – d7samurai

答えて

6

私は、お勧めの方法(または少なくとも私が推奨する方法)に近いと言います。

私は選択肢与えられ、あなたのコードにいくつかの変更を行うことになります。Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs) にStatusTextChanged宣言StatusTextChanged Protected Overridable

  • カスタムのEventArgsクラスでラップSTATUSTEXT
  • 変更してください

    • 結果コード:

      カスタムのEventArgsクラス:

      Public Class TextEventArgs 
          Inherits EventArgs 
      
          Private _text As String 
      
          Public Sub New(ByVal text As String) 
           _text = text 
          End Sub 
      
          Public ReadOnly Property Text() As String 
           Get 
            Return _text 
           End Get 
          End Property 
      
      End Class 
      

      あなたのベースクラスでのイベントの実装:

      Public Event StatusTextChanged As EventHandler(Of TextEventArgs) 
      Protected Overridable Sub OnStatusTextChanged(ByVal e As TextEventArgs) 
          RaiseEvent StatusTextChanged(Me, e) 
      End Sub 
      

      ...とイベントを発生させるための最後にコード行。基底クラスまたはそれを継承するクラスで、次のいずれか

      OnStatusTextChanged(New TextEventArgs("some text")) 
      

      これは、イベントが.NETフレームワークの残りの部分の中に設計されている方法に沿って、より多くなります。あなたが持っている可能性が

  • +0

    絶対に、イベントハンドラの.NET標準はSub EventHandler(送信者としてSystem.Object、e As System.EventArgs)です。 –

    +0

    基本的に私はポストの簡潔さのために単純化していました。しかし、基本クラスのイベントを子クラスから呼び出すだけでいいですね。まだ冗長なコードのように思える。あなたの答えは今のところ最高です。 – hmcclungiii

    1

    をSTATUSTEXTプロパティを設定し、基本クラスでこれによクラスをベースクラスのメソッドをオーバーライドする場合は、基本クラスの実装を呼び出すことが、最高の解決策であると言います。

    +0

    明確にするために、それは最善の解決策ですか?冗長なコードのようです。これをオーバーライドする必要はありませんが、少なくとも私が好むわけではありませんが、基本メソッド(それは基本クラスにあります)をオーバーライドしていないためNotOverridable宣言できません。質問を明確にすべきか? – hmcclungiii

    +0

    はい、それは他の実装よりも明快で心に残るものです。このメソッドは基本クラスに存在し、子に何も追加しないので、明示的にベースを呼び出してください:) – Lazarus

    0

    これは、このタイプのシナリオで派生クラスを介して基本クラスのイベントを発生させるための標準的な方法です。

    しかし、これは階層のStatusTextの管理者に応じて少し変わる可能性があります。アクセッサを介してのみ変更できるFooBaseの具体的なStatusTextバッキングフィールドがある場合、子はStatusTextChangedイベントの発生を制御できません。代わりに、私はStatusTextのプロパティのセッター内でのイベントの発生を強制します。これにより、親クラスは、前記イベントを発生させたくないときにいつでも望むすべてのコントラクトを強化することができます。

    ただし、StatusTextが派生クラスで定義する必要があるプロパティの場合は、表示するルートを選択します。

    +0

    ステータステキストのプロパティまたは変数さえありません。私はそれを公開したくはありませんでした。私は状態テキストのための保護されたgetter/setterを持つことができましたが、それは冗長コードのようにも見えます。 – hmcclungiii

    0

    1つのオプションは、それが変更 でイベント自体を発生させるように、基本クラスのStatusプロパティをラップしている(いけないとしてC#でVBを知っていて、現時点でのVisual Studioへのアクセス権を持っていけない)

    フレドリックはあなたが出ている方法は、.NET Frameworkの標準にかなり近い、指摘したように
    private string _status; 
    
    public string Status 
    { 
        get { return _status; } 
        protected set 
        { 
         if (_status == value) return; 
         _status = value; 
         StatusChanged(value); 
        } 
    } 
    
    0

    はここでデリゲートとイベントとステータステキスト

     
    Public Event Status As StatusEventHandler 
    
    Protected Overridable Sub OnStatus(ByVal e As StatusEventArgs) 
        RaiseEvent Status(Me, e) 
    End Sub 
    
    Public Delegate Sub StatusEventHandler(ByVal sender As Object, _ 
        ByVal e As StatusEventArgs) 
    
    <System.Serializable()> _ 
    Public Class StatusEventArgs 
        Inherits System.EventArgs 
    
        Public Sub New() 
        End Sub 
    
        Public Sub New(ByVal statusText As String) 
         _StatusText = statusText 
        End Sub 
    
        ' Enter code here for event properties, etc. 
    
        Private _StatusText As String = "" 
        Public Property StatusText() As String 
         Get 
          Return _StatusText 
         End Get 
         Set(ByVal value As String) 
          _StatusText = value 
         End Set 
        End Property 
    
    
    End Class 
    
    関連する問題