في رمز النظام الأصلي للشركة ، رأيت الكثير من الرموز التي تميز سمات اسم الفصل للكائنات التمييزية تتم معالجة بشكل منفصل. ويبدو أنها الطريقة القياسية للتعامل مع مشاكل مماثلة. ولكن قد يكون هناك بعض المشاكل.
بادئ ذي بدء ، نحن نعلم أن تعدد الأشكال هو واحد من الميزات الرئيسية الثلاث الموجه نحو الكائن. إن تعدد الأشكال المزعوم هو أنه بالنسبة لأنواع الخرسانة المختلفة ، يمكننا الوصول إليها من خلال نفس الواجهة التجريدية دون الحاجة إلى الارتباط بتفاصيل تنفيذ أنواع الخرسانة. تمامًا مثل إصدار إشعار: يجتمع جميع الموظفين في ميدان الأشخاص في الساعة التاسعة غدًا. ليس من الضروري إخطار كل شخص يعيش على وجه التحديد في موقع مختلف حول الوقت الذي يجب تحديده والطريق الذي يجب اتخاذه ، لأن هذه هي مسؤولية الشخص المحدد ، وليس مسؤولية الشخص الذي يخطر المصدر. لذلك ، عند الكتابة لتحديد أن اسم الفصل يحتاج إلى معالجة بشكل منفصل ، فإن الطريقة الأولى للتفكير هي إضافة واجهة إلى فئة الأصل وإكمالها من خلال تجاوز الفئة الفرعية. تغيير حجم الشكل على النحو التالي:
لأني: = 0 إلى قائمة الرسومات.
يبدأ
الرسومات: = قائمة الرسومات [i] ؛
if graphic.classname = 'strend' ثم
يبدأ
المستطيل (الرسم). الطول: = المستطيل (الرسم) .Length* 2 ؛
المستطيل (الرسم).
نهاية
وإلا إذا
يبدأ
دائرة (الرسم).
نهاية
نهاية؛
يمكنك إضافة طريقة "تغيير" إلى "الرسومات" الفئة الأصل ، والرمز كما يلي
الرسومات = الفصل
...
يتغير الإجراء (معدل: عدد صحيح) ؛
نهاية؛
مستطيل = فئة
...
الإجراء يتغير (معدل: عدد صحيح) ؛
نهاية؛
الدائرة = الفصل
...
الإجراء يتغير (معدل: عدد صحيح) ؛
نهاية؛
رمز لتنفيذ تغييرات الحجم في فئات الرسومات المحددة:
الإجراءات المستطيل. تغيير (معدل: عدد صحيح) ؛
يبدأ
طويل: = معدل طويل* ؛
العرض: = عرض* معدل ؛
نهاية؛
الإجراء circular.Changesize (معدل: عدد صحيح) ؛
يبدأ
دائرة نصف قطرها: = دائرة نصف قطرها* معدل ؛
نهاية؛
بعد تعديلها بهذه الطريقة ، يمكن تسمية الرمز أعلاه مثل هذا:
لأني: = 0 إلى قائمة الرسومات.
يبدأ
الرسومات: = قائمة الرسومات [i] ؛
Graphics.Changesize (2) ؛
نهاية؛
هذا يجعل الكود أكثر وضوحا.
بالطبع ، في كثير من الحالات ، لا يمكن استخدام الحل أعلاه عند الحكم على اسم الفصل. على سبيل المثال ، تكرار كوتولز في النموذج وإجراء تجارب أولية على ضوابط مختلفة. من المستحيل علينا إضافة طرق التهيئة إلى Tcontrol ، لا يمكننا إلا أن نستخدم لتمييز أنواع الفئات الفرعية المحددة. ثم في هذا الوقت أوصي باستخدام المشغل IS بدلاً من مقارنة اسم الفصل بشكل مباشر.
استخدام IS ، البيان aobject هو tform يؤدي إلى أنواع مختلفة من aobject:
AOBJECT هو TOBJECT ، والنتيجة خاطئة ؛
aobject هو tform ، والنتيجة صحيحة.
AOBject هو tform1 ، والنتيجة صحيحة ؛
Aobject tedit ، والنتيجة خاطئة ؛
aobject لا شيء ، والنتيجة خاطئة.
من المثال أعلاه ، يمكننا أن نرى ميزة استخدامها. في المستقبل ، يمكن استخدام TCOOLEDIT لتجميل الواجهة ، لذلك لا يلزم تغيير هذا الرمز ، لأن tcooledit هو tedit ؛
ثانياً ، إذا كان الكائن المحكوم عليه فارغًا ، فاستخدم اسم ClassName لتحديد ما إذا كان الكائن قد تم تعيينه أولاً ، وإلا فإن خطأ الوصول إلى الذاكرة سيحدث. يجب كتابة ممثل الحكم على النحو التالي: إذا تم تعيينه (AOBject) و AOBJECT.CLASTNAME = 'TCLASS1' ؛
السبب الأخير لا يتم استخدام اسم ClassName هو أن اسم ClassName يستخدم فقط لوصف خصائص الفئة. الأخطاء المنطقية.
إذا كان acontrol.classname = 'teidt' ثم سيتم التحقق من هذا الرمز فقط إذا لاحظت أنه لم يتم اختبار التحرير في البداية ؛
إذا كان Acontrol هو teidt ، فلا يمكن تجميعها وتمريرها ؛
استنادًا إلى ما سبق ، عندما يكون من الضروري تحديد النوع المحدد للكائن ، يجب علينا أولاً التفكير في تجنب عبارات المعالجة الخاصة هذه من خلال المعالجة المتعددة الأشكال. من اسم الفصل.
في حالة خاصة للغاية ، قد لا تحصل على النتيجة المرجوة ، كما لو كانت TEDIT و TCOOLEDIT بحاجة إلى التعامل معها بشكل منفصل. والتي ستكون أفضل من لا شيء.
Acooledit هو tedit // صحيح.
acooledit.clasStype = tedit // false ؛
acooledit.clasStype = tcooledit // true ؛