문제

좋아, 이벤트를 선언하는 기본 클래스가 있습니다. 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#은 본질적으로 동일하게 작동합니다.

편집 : 응답 후, 나는 기본 클래스에서 이것에 참석 한 다음, 그냥 아동 클래스에서 Statustext 속성을 설정합니다 ...

    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
도움이 되었습니까?

해결책

나는 당신이 권장되는 방법에 오히려 가깝다고 말할 것입니다 (또는 적어도 내가 추천 할 것).

선택 사항을 감안할 때 귀하의 코드를 몇 가지 변경할 것입니다.

  • statustextChanged를 만드십시오 Protected Overridable
  • 맞춤형 EventArgs 클래스에서 Statustext를 랩핑하십시오
  • StatustextChanged 선언을 변경하십시오 Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)

결과 코드 :

Custom 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 프레임 워크의 나머지 부분 내에서 설계되는 방식과 더 일치합니다.

다른 팁

자녀 수업이 기본 클래스 방법을 무시 해야하는 특정한 필요성이 없다면 기본 클래스 구현을 호출하는 것이 절대적으로 최상의 솔루션이라고 말합니다.

이것은 이러한 유형의 시나리오에 대해 파생 된 것들을 통해 기본 클래스에서 이벤트를 제기하는 표준 방법입니다.

그러나 이것은 계층 구조에 대한 통제권을 통제하는 사람에 따라 약간 변경 될 수 있습니다. Foobase에는 액세서리를 통해서만 변경할 수있는 구체적인 통계 후원 필드가 있다면, 나는 아동이 StatustextChanged 이벤트의 제기를 통제하지 못하게 할 것입니다. 대신에 나는 Statustext의 재산 세터 내에서 사건을 제기 할 것입니다. 이를 통해 상위 이벤트를 제기 할 때와시기에 필요한 계약을 시행 할 때 부모 클래스가 더 많은 제어를 제공합니다.

그러나 Statustext가 파생 클래스에 의해 정의되어야하는 속성이라면, 당신이 표시 한 경로를 선택합니다.

당신이 가질 수있는 옵션 중 하나는 기본 클래스에서 상태 속성을 래핑하여 이벤트 자체를 변경하여 이벤트 자체를 높이는 것입니다 (C#에서 VB를 모르고 현재 비주얼 스튜디오에 액세스 할 수 없습니다).

private string _status;

public string Status
{
    get { return _status; }
    protected set
    {
        if (_status == value) return;
        _status = value;
        StatusChanged(value);
    }
}

다음은 대의원과 상태 텍스트 매개 변수가있는 이벤트 코드입니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top