题
好了,我有一个基类宣布的活动 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
- 包StatusText在一个自定义定引类
- 改变StatusTextChanged宣言》
Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)
得到代码:
定制定引级:
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"))
这将更符合事件如何设计在其余的。净框架。
其他提示
除非对你的子类重写基类方法的特定需要,那么我会说,调用基类的实现,绝对是最佳的解决方案。
这是相当多的,用于经由衍生的一种用于这种类型的场景上的基类引发事件的标准方式。
然而,这可能取决于谁是在层次结构中的状态文本的控制改变了一下。如果在FooBase的具体状态文本支持字段只能通过访问器来改变,那么我不会让孩子控制StatusTextChanged事件的认识。相反,我将迫使属性状态文本的二传手内事件的认识。这给父类的更多的控制权在执行任何合同就是了左右时,当不提高所述事件。
然而,如果状态文本是必须由派生类中定义的属性,我会选择您所显示的路线。
你可以有一个选择是包裹状态属性的基类,所以它引发事件本身的变化 (在C#作为不知道VB和不必须的时刻获得的Visual Studio)
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
不隶属于 StackOverflow