문제
좋아, 이벤트를 선언하는 기본 클래스가 있습니다. 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