سؤال

لقد كنت أقوم ببعض السخرية باستخدام RhinoMocks ويتطلب الأمر جعل الأساليب التي يتم الاستهزاء بها افتراضية.هذا أمر جيد باستثناء أن لدينا إطارًا مخصصًا يحتوي على الأساليب التي أريد الاستهزاء بها والتي لم يتم وضع علامة عليها حاليًا على أنها افتراضية.

لا أستطيع أن أتوقع أي مشكلة في جعل هذه الأساليب افتراضية ولكني كنت أتساءل ما هي بعض المخاطر المحتملة لجعل الأساليب افتراضية والتي يجب أن أبحث عنها؟

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

المحلول

في الواقع قد يكون الأمر مشكلة كبيرة إذا لم تكن الطريقة مصممة ليتم تجاوزها وقام شخص ما بتجاوزها.على وجه الخصوص، لا تستدعي أبدًا طريقة افتراضية من المُنشئ.يعتبر:

class Base {
    public Base() {
       InitializeComponent();
    }
    protected virtual void InitializeComponent() {
        ...
    }
}

class Derived : Base {
    private Button button1;
    public Derived() : base() {
        button1 = new Button();
    }
    protected override void InitializeComponent() {
        button1.Text = "I'm gonna throw a null reference exception"
    }
}

قد لا تكون الفئة المشتقة على علم بأن استدعاء الأسلوب الظاهري سيؤدي إلى استدعاء أسلوب التهيئة الخاص بها قبل تشغيل سطر واحد من المنشئ الخاص بها.

نصائح أخرى

  • إذا كان لديك مستخدمون يتجاوزون أساليبك الافتراضية، فلن تتمكن من إغلاقهم مرة أخرى دون كسر التعليمات البرمجية.
  • قد تقع أي أساليب افتراضية تستدعيها من المُنشئ في تطبيقات مشتقة وإذا لم تستدعي الطريقة الأساسية وكان المُنشئ يعتمد عليها، فقد يكون الكائن في حالة غير صالحة

لدى Ayende معالجة لطيفة لكيفية عمل الأساليب الافتراضية:

http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx

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