سؤال

أحاول القيام بما يلي:

public abstract BaseClass {

  public virtual void ReceiveEvent(Event evt)
    {
        ProcessEvent(evt as dynamic);
    }

    private void ProcessEvent(object evt)
    { 
        LogManager.Log(@"Received an event that is not being processed! 
                        Dispatch fallback");
    }
}

public DerivedClass: BaseClass {

    private void ProcessEvent(SpecificEvent evt)
    { 
        LogManager.Log("Processing Event");
    }
}

ضرب سبيسيفيكيفنتس الأسلوب الاحتياطي بدلا من واحد في الفئة المشتقة.يمكنني استخدام ديسباتش ديناميكية داخل نفس الفئة في كل وقت وتجد أنه من المفيد حقا/نظيفة.أنها لن تعمل مع الطبقات المشتقة كما هو موضح في المثال أعلاه?

تحرير: يبدو أن هناك بعض الالتباس في الإجابات.أساسا يمكنني استخدام التصميم التالي في كل وقت:

public class SomeClass{

    public void DoSomethingDispatcher(SomeObject obj)
    {
        ProcessObject(obj as dynamic);
    }

    private void DoSomething(SomeObjectType1 obj)
    { 

    }

    private void DoSomething(SomeObjectType2 obj)
    { 

    }

    private void DoSomething(SomeObjectType3 obj)
    { 

    }

    private void DoSomething(object obj) //fallback
    { 

    }
}

يعمل بشكل رائع عندما أنت لا تعرف النوع الدقيق مسبقا ولا تريد استخدام عبارة تبديل كبيرة.فقط أتساءل عما إذا كان يمكن تنفيذ ذلك مع الميراث حيث تحتفظ الفئة الأساسية بالطريقة الاحتياطية وتحمل الفئة المشتقة جميع الطرق الأكثر تحديدا.

هل كانت مفيدة؟

المحلول

لا يعمل من أجلك لأنه حتى إذا تم تمرير EVT ديناميكي، فلن يتم الإعلان عن Processevent بأنه افتراضي.هذا يعني أنه عند تجميع المكالمة إلى Processevent، يتم ربطه بالتنفيذ الوحيد للطريقة الموجودة في الفئة الأساسية، ولن يتم تنفيذ تلك الموجودة في الفئات المشتقة.علاوة على ذلك، لا يمكنك ببساطة أن تعلن معالجتك بيضاؤلا، نظرا لأن التوقيع سيكون مختلفا في الفئات المشتقة.

من أجل عمل التعليمات البرمجية الخاصة بك كما هو متوقع، يمكنك فقط تجاوز adkevent في الفئات المشتقة مما يتركها بالضبط: giveacodicetagpre.

إذا كنت ترغب في إدارة الأحداث غير المعالجة في الفئة الأساسية، ما عليك سوى تغيير معدل "تعديل حدث العملية" في الفئة الأساسية إلى المحمية (وإلا فإنه لا يمكن تنفيذه عند استدعاءه بواسطة إصدار Overidden من Erudevents).

نصائح أخرى

إذا كانت الطريقة ليست كذلك virtual/abstract في الفئة الأساسية ، ولا يتم وضع علامة على الطريقة على أنها override في الطبقة المشتقة ، لن تعمل أبدا.

أيضا ، أنا لا أفهم استخدام dynamic هنا.

ما هو نوع "EVT" عندما تضرب Processevent؟

قد نلقي نظرة على باستخدام نوع الديناميكي :

النوع هو نوع ثابت، ولكن كائن يتجاوز نوع الديناميكي فحص النوع الثابت.في معظم الحالات، فإنها تعمل مثلها كائن.

لذلك، evt ليس guardaceticetagcode.

للحصول على السلوك المتوقع ، يجب عليك تجاوز الطريقة الافتراضية:

public DerivedClass: BaseClass
{
  private override void ReceiveEvent(Event evt)
  { 
      // Process your event here.
  }
}

مع هذا الرمز, ReceiveEvent في الفئة الأساسية لن يتم استدعاؤها ، وبالتالي فإن الاحتياطي ProcessEvent لن يتم استدعاؤها.

لا يوجد سبب لاستخدام dynamic.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top