رفع قاعدة الطبقة الأحداث في الفئات المشتقة C#

StackOverflow https://stackoverflow.com/questions/780022

  •  13-09-2019
  •  | 
  •  

سؤال

لدي قاعدة الطبقة DockedToolWindow :وشكل العديد من الفئات التي تستمد من DockedToolWindow.لدي الطبقة الحاوية التي تحمل ويعين الأحداث DockedToolWindow الكائنات ، ومع ذلك أريد أن تحتج الأحداث من الطبقة الطفل.

في الحقيقة لدي سؤال عن كيفية تنفيذ ما هذا موقع MSDN تقول لي أن أفعل.هذا القسم أدناه يسبب لي مشكلة:

    // The event. Note that by using the generic EventHandler<T> event type
    // we do not need to declare a separate delegate type.
    public event EventHandler<ShapeEventArgs> ShapeChanged;

    public abstract void Draw();

    //The event-invoking method that derived classes can override.
    protected virtual void OnShapeChanged(ShapeEventArgs e)
    {
        // Make a temporary copy of the event to avoid possibility of
        // a race condition if the last subscriber unsubscribes
        // immediately after the null check and before the event is raised.
        EventHandler<ShapeEventArgs> handler = ShapeChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }

بالتأكيد هذا المثال برمجيا و يعمل لكن عند استبدال "ShapeChanged" مع "التحرك" (حدث ما اكتسب من المستمدة من النموذج) ، أخطاء قائلا أنا لا يمكن أن تتحرك على الجانب الأيمن دون += أو=.أنا أيضا إزالة ShapeEventArgs عامة العلامات.

أي تحرض على لماذا لا يعمل ؟ ما الفرق بين الحدث أعلن داخل الطبقة واحد هو أن ورثت ؟

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

المحلول

لا يمكنك إطفاء أحداث الطبقة الأساسية مباشرة. هذا هو بالضبط السبب وراء القيام بك OnShapeChanged طريقة protected بدلاً من private.

يستخدم base.onmove () في حين أن.

نصائح أخرى

من لغة C# المواصفات ، القسم 10.7 (التشديد مضاف):

ضمن برنامج نص الدرجة أو البنية التي تحتوي على إعلان الحدث ، أحداث معينة يمكن استخدامها مثل الحقول.تستخدم في هذه الطريقة ، وهو حدث لا يجب أن تكون مجردة أو خارجي ، يجب أن لا تتضمن صراحة الحدث-ثانوي-الإعلانات.مثل هذا الحدث يمكن أن تستخدم في أي السياق الذي يسمح المجال.الحقل يحتوي على مندوب (المادة 15) الذي يشير إلى قائمة من معالجات الأحداث التي تمت إضافتها إلى هذا الحدث.إذا لم معالجات الأحداث تم إضافة حقل يحتوي على قيمة خالية.

وبالتالي ، فإن السبب لا يمكنك معاملة نقل الحدث مثل الميدان هو المحدد في نوع مختلف (في هذه الحالة الفائقة).أنا أتفق مع @womp هناك تكهنات بأن المصممين جعل هذا الخيار لمنع غير مقصودة هؤلاء يتلاعبون مع الحدث.يبدو من الواضح سيئة للسماح لها علاقة types (أنواع لا المستمدة من نوع معلنا الحدث) للقيام بذلك ، ولكن حتى بالنسبة مشتقة أنواع, قد لا يكون مرغوبا فيه.ربما قد تشمل جملة للسماح حال إعلان أن تكون مصنوعة private أو protected فيما يتعلق الميدانية على غرار الاستخدام ، لذا أعتقد أنها اختارت أن مجرد رفض ذلك تماما.

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

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

تحتاج فقط إلى الرمز الذي نشرته في الفصل حيث يتم تعريف الحدث نفسه. يجب على جميع الفئات المشتقة أن تتصل ببساطة Onshapechanged () أو Onmove () مباشرة، دون النسخ وما إلى ذلك، لذلك يجب ألا تكتب هذا الرمز على الإطلاق في فصولك (نظرا لأن حدث التحريك محدد في القاعدة).

إذا كنت بحاجة إلى القيام ببعض المعالجة في الفئة المشتقة (ربما تحتاج إلى كمان مع فئة المجموعة الخاصة بك؟)، يمكنك تجاوز مكالمة onxxx الظاهرية وتفعل الاشياء قبل الاتصال base.onxxx (). في مقالة MSDN، تتوافق فئة الدائرة مع فئة DockedToolwindow. يجب أن يكون نفس النمط متاحا لفصولك المشتقة.

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