هل دلفي استدعاء الموروث على تجاوز الإجراءات إذا لم يكن هناك دعوة صريحة

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

  •  09-06-2019
  •  | 
  •  

سؤال

هل دلفي استدعاء الموروث على تجاوز الإجراءات إذا لم يكن هناك دعوة صريحة في قانون أي (ورثت;), لدي البنية التالية (من السوبر إلى فئة فرعية)

تفورم >> TBaseForm >> TAnyOtherForm

جميع أشكال في المشروع سوف تكون مشتقة من TBaseForm ، لأن هذا سوف يكون كل معيار إعداد المدمرة الأجزاء التي يتم استخدامها لكل شكل (الأمن التحقق من صحة إلخ).

TBaseForm وقد onCreate و onDestroy الإجراءات مع القانون للقيام بذلك ، ولكن إذا كان شخص ما (أي بي) نسيت أن أضيف الموروثة إلى onCreate على TAnyOtherForm أن دلفي نسميها لي ؟ لقد وجدت المراجع على شبكة الإنترنت أن أقول أنه غير مطلوب ، ولكن في أي مكان يقول إذا أصبح يسمى في حالة حذف من التعليمات البرمجية.

أيضا إذا كان كذلك استدعاء الموروث بالنسبة لي ، عندما سوف نسميها ؟

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

المحلول

لا, إذا تركت الدعوة إلى ورثت بعيدا ، لن يتم استدعاؤه.وإلا فإنه لن يكون من الممكن تجاوز الأسلوب تماما أمية الوالدين نسخة منه.

نصائح أخرى

ومن الجدير بالذكر أنه لا يدعو الموروثة في تدمير أي كائن يمكن أن يسبب تسرب الذاكرة.هناك الأدوات المتاحة للتحقق من هذا في التعليمات البرمجية المصدر.

الموروثة الدعوة يجب أن يكون صريحا.في أي عام اللغة تلقائيا المكالمات الموروثة وظيفة في حالات تعادل (فئة الصانعين غير المدرجة).

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

ربما كنت قد تجاوز DoCreate و DoDestory في TBaseForm الدرجة حتى يمكن التأكد من بعض يتم تنفيذ التعليمات البرمجية بغض النظر عن تنفيذ الطبقات الطفل.

// interface

TBaseForm = Class(TForm)
...
Protected
    Procedure DoCreate(Sender : TObject); Override;
End

// implementation

Procedure TBaseForm.DoCreate(Sender : TObject);
Begin
    // do work here

    // let parent call the OnCreate property  
    Inherited DoCreate(Sender);
End;

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

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

procedure TMyCalcObject.SolveForX;
begin
  ResetCalcState;
  inherited SolveForX;
  PostProcessSolveForX;
end;

لا.هذا هو بيت القصيد الغالبة.

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

يجب أن يكون هناك نوع من التوجيه "skip_inherited" أن نخبر المترجم أن كنت لا ترغب في استدعاء الموروث الأسلوب.

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

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