سؤال

حسنا, لذلك لدي قاعدة الطبقة التي تعلن الحدث 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top