الأحداث في فئات أساسية
-
22-08-2019 - |
سؤال
حسنا, لذلك لدي قاعدة الطبقة التي تعلن الحدث 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
المحلول
أود أن أقول أن كنت بدلا من ذلك على مقربة من recommeneded طريقة (أو على الأقل واحدة أنصح).
وأود أن جعل بعض التعديلات على الكود الخاص بك الإختيار:
- جعل StatusTextChanged
Protected Overridable
- التفاف StatusText في العرف EventArgs الدرجة
- تغيير StatusTextChanged الإعلان إلى
Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)
الرمز الناتج:
مخصص 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 framework.
نصائح أخرى
ما لم يكن هناك حاجة معينة لفئة طفلك على تجاوز أسلوب الفئة الأساسية ثم أود أن أقول إن استدعاء تنفيذ الفئة الأساسية على الاطلاق أفضل حل.
وهذا هو الى حد كبير الطريقة القياسية لجمع الأحداث على فئة أساسية عن طريق واحد مشتق لهذا النوع من السيناريو.
ولكن هذا قد يتغير قليلا اعتمادا على من هو في السيطرة على StatusText التسلسل الهرمي. إذا كان هناك مجال دعم StatusText ملموس في FooBase التي يمكن تغييرها فقط عبر يمكنهم الدخول، ثم أنا لن تسمح للطفل السيطرة على رفع الحدث StatusTextChanged. بدلا من ذلك سيجبر تربية الأحداث داخل واضعة للعقار لStatusText. وهذا يعطي الفئة الأصل مزيد من السيطرة في فرض أي عقود انها تريد حول متى ومتى لا لرفع الحدث قال.
ولكن إذا كان StatusText هو خاصية التي يجب أن تكون محددة من قبل فئة مشتقة، وأود أن اختيار الطريق الذي المعروضة.
وخيار واحد هل يمكن أن يكون هو التفاف الملكية الحالة في الفئة الأساسية، بحيث يرفع الحدث نفسه في التغيير (في 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