تحليل الأشكال في دلفي
1 ما هو تعدد الأشكال؟ 2
1.1 المفهوم 2
1.2 معنى تعدد الأشكال 2
1.3 كيفية تنفيذ تعدد الأشكال في دلفي؟ 2
1.3.1 الميراث 2
1.3.2 الطرق الافتراضية ، الطرق الديناميكية والأساليب التجريدية ، VMT/DMT ، الربط الثابت والربط الديناميكي 2
1.3.3 الحمل الزائد والتشكيل 2
1.4 مناقشة حول الأنواع المتعددة الأشكال 2
1.4.1 تعدد الأشكال على مستوى 2
1.4.2 تعدد الأشكال غير الآمن 2
2 تطبيقات تعدد الأشكال في VCL2
2.1 طريقة البناء والتدمير 2
2.2 TSTRINGS2
2.3 آخرون (الرجاء إضافة الروح) 2
تعدد الأشكال المجردة هي روح الكائنات.
تعدد الأشكال الكلمة الرئيسية ، الميراث ، الموجهة نحو الكائن ، VCL ، الطريقة الافتراضية ، تجاوز
سؤال
تعدد الأشكال هو روح الموجهة نحو الكائن ، وفهم تعدد الأشكال هو أحد مفاتيح التكنولوجيا الموجه نحو الكائن. ولكن ما هو بالضبط تعدد الأشكال؟多态有何意义?怎么实现多态? أستطيع أن أفهم مفهوم الأشكال ، لكنني لا أعرف كيفية استخدامه ومتى أستخدمه؟ يرجى قراءة هذا المقال بالتفصيل.
تحليل الخبراء
العالم ، أي كائن) متغير باستمرار ؛ حسنًا ، على الرغم من أن بعض الأشخاص يكتبون البرامج الموجهة نحو الكائنات ، إلا أنني أجرؤ على الاستنتاج entire software industry was earth-shaking. Changes, starting from the changes in programming languages, a series of object-oriented programming languages (OOPs) such as SmallTalk, C++, java, Object Pascal, C#, etc.; various object- oriented development tools have also appeared, such as VC, Delphi, and BCB. , JBuilder, etc., and many excellent class libraries have emerged, such as VCL, .net Framework and some commercial class libraries; then they have developed to object- التصميم الموجود (OOD) ، والتحليل الموجهة للكائنات (OOA) ، وقاعدة البيانات الموجهة للكائنات (OODB)) ، وقد اخترقت التكنولوجيا الموجهة نحو الكائنات تقريبًا مجال البرمجيات بأكمله ، وقد خضعت طريقة تفكير المبرمجين أيضًا إلى تغييرات أساسية! في عيون بعض منظري تنقية OO ، كل شيء هو كائن! على الرغم من أنني لا أتفق تمامًا مع هذا الرأي. لكنني أعتقد أن هذه الطريقة تتماشى مع عادات تفكير الناس الدماغ منذ ذلك الحين ، تحررت! هذه ثورة!
المحتوى الأساسي الموجه إلى الكائن هو الكائن ، والتغليف ، والميراث ، وتعدد الأشكال وآليات الرسائل. تعدد الأشكال الرئيسية ، لن تتقن التكنولوجيا الموجهة نحو الكائن حقًا.
1 ما هو تعدد الأشكال؟
1.1 مفهوم
هناك العديد من الآراء المختلفة حول مفهوم تعدد الأشكال ، وما يلي هي عدة بيانات تمثيلية:
"هذه القدرة على معالجة أكثر من نوع واحد مع مؤشر أو إشارة إلى فئة أساسية تتحدث عن تعدد الأشكال" (C ++ Primer ، صفحة 838). أي أن القدرة على تشغيل كائنات فئات متعددة (فئة أساسية وفئاتها المشتقة) باستخدام مؤشرات/مراجع إلى الفئات الأساسية تسمى تعدد الأشكال. يعتبر من منظور تنفيذ اللغة.
"تعدد الأشكال يوفر بُعدًا آخر لفصل الواجهة عن التنفيذ ، إلى فصل ما عن كيفية" "التفكير في Java" المستحضر الثالث) ، أي أن تعدد الأشكال يوفر نوعًا آخر من واجهة الفصل والتنفيذ (أي "ما يجب فعله" و " "كيف تفعل القيام بمقياس" بشكل منفصل ". يعتبر من منظور التصميم.
"يشار إلى القدرة على استخدام نفس التعبير للدلالة على عمليات مختلفة باسم تعدد الأشكال" (مبادئ الأساليب الموجهة للكائنات والممارسة الطبعة الثالثة ، ص 16). ببساطة ، تعدد الأشكال هو "نفس التعبير ، العمليات المختلفة" ، أو يمكن قوله لـ "نفس الأمر ، عمليات مختلفة". هذا من منظور الدلالات الموجهة نحو الكائن.
تشرح البيانات الثلاثة جوهر الأشكال من وجهات نظر مختلفة. البيان الثالث دقيق بشكل خاص.
اسمحوا لي أن أشرح معنى هذه الجملة أولاً:
نفس التعبير - استدعاء الوظيفة
عمليات مختلفة - هناك عمليات مختلفة وفقًا لكائنات مختلفة.
على سبيل المثال ، في الشركة ، هناك العديد من الموظفين الذين يتمتعون بمسؤوليات مختلفة (المبرمجين ، الباعة ، مديري المستندات ، وما إلى ذلك) الذين يقومون بأشياء مختلفة عندما "يذهبون إلى العمل" (يمكن اعتبارهم أيضًا نوعًا من منطق العمل) ، نحن الملخص لعملهم "للعمل" ، والعلاقة على النحو التالي:
طاقم عمل
/ |
مدير وثيقة مندوب مبيعات المبرمج
بمجرد أن تأتي ساعات العمل كل يوم ، فإنه يعادل إصدار أمر مثل هذا:
"الموظفين. ابدأ العمل" (نفس التعبير)
بعد أن يتلقى كل موظف هذا الأمر (نفس الأمر) ، "يبدأ في العمل" ، لكن ما يقومون به هو عمل كل منهما ، ويبدأ المبرمج "الترميز" ، ويبدأ المبيعات في "الأعمال التجارية" ، والمدير الثقافي لنبدأ " تنظيم المستندات ". وهذا هو ، "نفس التعبير (استدعاء الوظيفة) ، عمليات مختلفة (تنفذ وفقًا لكائنات مختلفة خلال فترة وقت التشغيل)."
من منظور تنفيذ اللغة تعدد الأشكال ، يتم تحقيق تعدد الأشكال من خلال استدعاء طريقته الافتراضية بواسطة مؤشرات الفئة الأساسية أو الإشارات إلى كائنات تشير إلى الفئات المشتقة. فيما يلي تنفيذ لغة الكائن باسكال
temworye = class // الموظفين المجردين في فصل تجريدي
عام
الإجراء بدء التشغيل ؛ افتراضي ؛ مجردة ؛
{وظائف الملخص (أي الوظائف الظاهرية النقية في C ++) ، لا تفعل شيئًا ، والمعنى الفعلي هو حجز واجهة أولاً. يحمل الحمل الزائد في فئتها المشتقة. }
نهاية؛
tprogramer = فئة (temworyee) // المبرمج
عام
الإجراءات البدء ؛
نهاية؛
tbusinessman = فئة (templyee) // مندوب المبيعات
عام
procedure startWorking;override;
نهاية؛
Tdocmanager = فئة (Temworyee) // مدير النص
عام
الإجراءات البدء ؛
نهاية؛
الإجراء tprogramer.startWorking ؛
يبدأ
ShowMessage ('الترميز') ؛
نهاية؛
{tbusinessman}
الإجراء tbusinessman.startWorking ؛
يبدأ
ShowMessage ("ربط الأعمال") ؛
نهاية؛
{tdocmanager}
الإجراء tdocmanager.startWorking ؛
يبدأ
ShowMessage ("إدارة المستند") ؛
نهاية؛
الإجراء tform1.button1click (المرسل: tobject) ؛
كونست
التعداد = 3 ؛
var
الموظف: مجموعة من temmoryee ؛
أنا: عدد صحيح.
يبدأ
setLength (الموظف ، التعداد) ؛
الموظف [0]: = tprogramer.create ؛
// راجع موظف الفئة الأساسية [0] للإشارة إلى كائن Tprogramer الذي تم إنشاؤه للتو
الموظف [1]: = tbusinessman.create ؛
// ارجع إلى موظف الفئة الأساسية [1] للإشارة إلى كائن tbusinessman الذي أنشأته للتو
الموظف [2]: = tdocmanager.create ؛
// راجع موظف الفئة الأساسية [2] للإشارة إلى كائن Tdocmanager الذي تم إنشاؤه للتو
لأني: = 0 إلى الطول (الموظف) -1
الموظف [i].
{从语言实现多态的角度来说,多态是通过基类指针或引用指向派生类的对象,调用其虚方法来实现的。 يشير الموظف [] إلى صفيف لكائن الفئة الأساسية ، ويشير أعضائه إلى كائنات فئة مشتقة مختلفة على التوالي.
نهاية؛
جربها
يمكنك كتابة بعض الكود أعلاه (أو البرامج التجريبية) ، وتجميعها وتشغيلها ، والنقر فوق الزر لرؤية التأثير السحري للتعدد الأشكال.
1.2 معنى تعدد الأشكال
يتمثل معنى التغليف والميراث في تنفيذ إعادة استخدام الكود ، في حين أن معنى تعدد الأشكال هو أنه ينفذ إعادة استخدام الواجهة (نفس التعبير). قادرة.
على سبيل المثال ، من أجل إدارة أفضل ، يتم تقسيم المبرمجين إلى مبرمجين C ++ ومبرمجي Delphi. ...
طاقم عمل
/ |
مدير وثيقة مندوب مبيعات المبرمج
/ / - العلاقة
C ++ مبرمج Delphi Programmer
بعد أن أضاف المبرمج فئتين مشتقتين من TCPPProgramer و tdelphiprogrogramer ، لا تزال طريقة الاتصال لم تتغير ، وكانت لا تزال "موظفين. ابدأ العمل" ، والذي تم وصفه باستخدام كائن باسكال:
...
setLength (الموظف ، التعداد+2) ؛
الموظف [enum]: = tcppprogramer.create ؛
// قم بإنشاء كائن TCPPPRamper وأوجه الموظف المرجعي للفئة الأساسية [enum]
الموظف [enum+1]: = tdelphiprogramer.create ؛
...
{القطاعات.
لأني: = 0 إلى الطول (الموظف) -1
الموظف [i].
...
1.3 كيفية تنفيذ تعدد الأشكال في دلفي؟
الظروف اللازمة لتحقيق تعدد الأشكال هي الميراث ، والطرق الافتراضية ، والربط الديناميكي (أو الربط المتأخر).
1.3.1 الميراث
继承指类和类之间的“AKO(A Kind Of,是一种)”关系,如程序员“是一种”员工表示一种继承关系。 في دلفي ، يتم دعم الوراثة الفردية فقط (لا توجد دراسة للميراث المتعدد التي تنفذها الواجهات). من خلال كائنات الفئة المشتقة (أو العكس).
تَلمِيح
في UML:
AKO: A Kind Of 表示继承(Inheritance)关系
APO: يمثل جزءًا من علاقة مزيج
ISA: ISA تمثل العلاقة بين كائن وفئة تنتمي إليها.
1.3.2 الطرق الافتراضية والطرق الديناميكية والأساليب التجريدية ، VMT/DMT ، الربط الثابت والربط الديناميكي
لجميع الطرق ، لا يوجد أثر في الكائن. يتم تخزين مؤشر الطريقة (عنوان الإدخال) في الفصل ، بينما يتم تخزين الكود الفعلي في قطاع الرمز. بالنسبة للطرق الثابتة (الطرق غير الذروة) ، يحدد المترجم مباشرة عنوان الإدخال لطريقة الكائن بناءً على نوع مرجع الكائن في وقت الترجمة ، والذي يسمى الربط الثابت ؛ لا يمكن للمترجم تحديد الفئة الفعلية التي ينتمي إليها ، لذلك لا يمكن تحديد عنوان إدخال الطريقة إلا من خلال عنوان إدخال جدول VMT (أي البايتات الأربعة الأولى من الكائن) أثناء وقت التشغيل. تأخر التجمع).
الطريقة الافتراضية
تمثل الطريقة الافتراضية طريقة يمكن تجاوزها. بالإضافة إلى تخزين مؤشر الطريقة الافتراضية الخاصة به ، يقوم الفصل أيضًا بتخزين مؤشر الطريقة الافتراضية لجميع الفئات الأساسية.
طريقة الإعلان:
اسم طريقة الإجراء ؛
هذا يعادل إخبار مترجم دلفي:
يمكن زيادة تحميل هذه الطريقة في الفئة المشتقة ، وستظل الطريقة الافتراضية لا تزال بعد التحميل الزائد.
لا تقم بتحديد عنوان إدخال الطريقة خلال فترة التجميع. أثناء وقت التشغيل ، يتم تحديد عنوان إدخال الطريقة من خلال الربط الديناميكي.
توفير تطبيق افتراضي في الفئة الأساسية.
طريقة ديناميكية
الأساليب الديناميكية والطرق الافتراضية هي نفسها بشكل أساسي. ولكن هذا شفاف تماما للمستخدمين.
طريقة الإعلان:
اسم الإجراء ؛ ديناميكي ؛
طرق مجردة
يتم استخدام طريقة افتراضية خاصة ، والتي لا تحتاج إلى توفير تطبيق افتراضي في الفئة الأساسية ، فقط لواجهة الاتصال ، والتي تعادل وظيفة افتراضية خالصة في C ++. وتسمى الفصول التي تحتوي على أساليب مجردة الفصول التجريدية.
طريقة الإعلان:
اسم الإجراء ؛ افتراضي ؛ مجردة ؛
VMT/DMT
في Delphi ، يعد جدول الأسلوب الافتراضي (VMT) في الواقع جسديًا. الأساليب الافتراضية من فئة القاعدة. "عنوان إدخال VMT" المخزن في بايت الأربعة الأولى من الكائن هو في الواقع عنوان الفئة التي ينتمي إليها (انظر البرنامج التجريبي). مع الفصل الفعلي ، يمكن العثور على عنوان الطريقة الافتراضية.
OBJ (اسم الكائن) الفئة التي ينتمي إليها الكائن الفعلي
عنوان إدخال VMT
أعضاء البيانات
عنوان إدخال VMT لجدول الطريقة الافتراضية للفئة
معلومات قالب عضو البيانات
طرق ثابتة ، إلخ.
الطريقة الافتراضية (VMT)
الطريقة الديناميكية (DMT)
الشكل 3 العلاقة بين أسماء الكائنات والكائنات والفئات
يشبه DMT VMT ، وهو أيضًا مفهوم منطقي. is not as fast as that of virtual methods. It is a strategy of sacrificing time and exchanging space, and is generally not recommended.
اقتبس المثال أعلاه لشرح:
الموظف [i] .StartWorking ؛
الموظف [i] هو مرجع كائن للطبقة الأساسية. لذلك لا يمكن معرفة الكائن الفعلي أثناء التجميع ، لذلك لا يمكن تحديد عنوان الطريقة. During the run period, of course, I know the "true face of Lushan" of the object. Based on the content of the first four bytes of the actual object, that is, the entry address of the virtual method table VMT, I find الوظيفة التي يجب استدعاؤها ، أي ، تتحقق تعدد الأشكال.
1.3.3 الحمل الزائد والتشكيل
يعتقد العديد من مستخدمي الإنترنت أن التحميل الزائد للوظيفة هو أيضًا نوع من الأشكال ، لكنه ليس كذلك. بالنسبة إلى "العمليات المختلفة" ، لا يمكن أن يوفر التحميل الزائد طريقة المكالمات. فرضية تنفيذ تعدد الأشكال هي نفس التعبير! على سبيل المثال ، الموظف [i] التحميل الزائد هو مجرد آلية لغة ، وهناك أيضًا تحميل زائد في C ، ولكن C ليس له تعدد الأشكال و C ليس لغة برمجة موجهة نحو الكائن. ما لم تكن وظيفة التحميل الزائد هي أيضًا طريقة افتراضية ، يمكن للمترجم تحديد عنوان إدخال الوظيفة بناءً على نوع المعلمة ، أو الربط الثابت! اقتبس من والد C ++ ، "لا تكن غبيًا. إذا لم يكن الربط الديناميكي ، فهذا ليس تعدد الأشكال".
1.4 مناقشة حول الأنواع المتعددة الأشكال
1.4.1 تعدد الأشكال على مستوى
مستوى الكائن: استخدم مؤشر الفئة الأساسية/مرجع للإشارة إلى كائن الفئة المشتق ، واستدعاء الطرق الافتراضية (أو الطرق الديناميكية ، الطرق التجريدية) ، والتي هي الأكثر استخدامًا.
مستوى الفئة: استخدم مراجع الفئة (الإشارات إلى الفئات بدلاً من الكائنات) للإشارة إلى الفئات المشتقة ، واتصال طرق الفئة الافتراضية (أو طرق الفئة الديناميكية ، وطرق الفئة التجريدية) ، ويتم استخدامها عادة في الأشكال المتعددة التي أنشأتها الكائنات (لأن المنشئ هو نوع من الأساليب "الخاصة" من النوع الخاص ، يرجى الرجوع إلى عملي الآخر "تحليل الهيكل والدمار في دلفي" ، القسم 2.1).
تَلمِيح
مرجع الفئة هو متغير مرجعي للفئة نفسها ، وليس فئة ، ولا مرجع كائن. تمامًا مثلما يمثل اسم الكائن مرجع كائن ، يمثل اسم الفئة مرجعًا للفصل ، لأنه في دلفي ، تتم معالجة الفئة أيضًا ككائن. نوع مرجع الفصل هو نوع مرجع الفئة ، وطريقة الإعلان لنوع مرجع الفئة:
اسم نوع مرجع الفئة = فئة اسم الفصل
يمكننا أن نرى العديد من الإعلانات المرجعية للفصل في رمز مصدر VCL ، مثل:
tclass = فئة من tocject ؛
tcomponentClass = فئة tcomponent ؛
tcontrolclass = فئة من tcontrol ؛
يلاحظ
في طريقة الفصل ، فإن الذات الضمنية في الطريقة هي مرجع فئة ، وليس مرجع كائن.
1.4.2 تعدد الأشكال غير الآمن
يمكن أيضًا تنفيذ تعدد الأشكال باستخدام مؤشرات/مراجع فئة مشتقة إلى كائنات الفئة الأساسية!
الإجراء tform1.btnbadpolyclick (المرسل: tobject) ؛
var
CPPPROGRAMER: TCPPPROMER ؛ // تحديد مرجع مبرمج CPP ، إشارة إلى فئة مشتقة!
يبدأ
{*****************************إفادة******************* ******************
تعدد الأشكال التي تم تنفيذها مع مؤشرات فئة مشتقة/مراجع للكائنات الفئة الأساسية. إنه تعدد الأشكال المرضي!
هذه الطريقة متعددة الأشكال مثل شيء صغير جدًا (كائن فئة أساسي) مغطى بأسلوب قوي
وبالتالي فإن ظهور المنتج (المراجع الفئة المشتقة) يجلب العديد من عوامل انعدام الأمن المحتملة (مثل استثناءات الوصول) ، لذلك
مع عدم وجود قيمة تقريبًا. يهدف مثال "ملف" إلى توضيح طبيعة تعدد الأشكال في دلفي ، طبيعة تعدد الأشكال: استخدم مؤشر/مرجع قانوني (عادةً ما يكون الفئة الأساسية) لتشغيل الكائن ، وفقًا للكائن الفعلي أثناء وقت التشغيل ، لتنفيذ عملية مختلفة الأساليب ، أو لبيان أكثر حيوية: يحتاج الكائن نفسه إلى طريقة التشغيل الخاصة به. الكائن. وهذا يتيح فصل الواجهات والتطبيقات ، مما يجعل إعادة استخدام الواجهة ممكنة.
****************************************************** ******* *********************************}
cppprogramer: = tcppprogramer (tprogramer.create) ؛
{من أجل تحقيق تعدد الأشكال المرضي ، يتم إلقاء مرجع الكائن على نوع TCPPProgramer ،
وبالتالي يهرب من فحص المترجم}
cppprogramer.startWorking ؛
{tprogramer.StartWorking دعا بدلاً من tcppprogramer.startWorking
هذا هو تعدد الأشكال المنفذة مع مؤشرات/إشارات الطبقة المشتقة إلى كائن الفئة الأساسية. }
cppprogramer.free ؛
CPPProgramer: = tcpprogramer (tdocmanager.create) ؛
cppprogramer.startWorking ؛
{المكالمة هي tdocmanager.startworking ،
هذا هو تعدد الأشكال المنفذة مع مؤشرات/إشارات الطبقة المشتقة إلى كائن الفئة الأساسية. هذه الطريقة غير آمنة للغاية.
وليس هناك حاجة}
cppprogramer.free ؛
نهاية؛
جربها
In order to obtain this kind of perceptual understanding of polymorphism, it is recommended to try it. The above mentioned that this method of use will have potential insecure (such as access exceptions), and the above program runs without any errors. Think about why ؟ تحت أي ظروف سيحدث استثناء الوصول؟ (ارجع إلى البرنامج التجريبي)
2 تطبيقات تعدد الأشكال في VCL
2.1 أساليب البناء والتدمير
تعدد الأشكال لطريقة البناء
نظرًا لأن المُنشئ يمكن اعتباره طريقة فئة "خاصة" ، يتم إعادة تعريف جميع الفئات المشتقة بعد TCOMPONENT كطرق فئة افتراضية ، لذلك لإدراك تعدد الأشكال للمركبة ، يجب استخدام مراجع الفصل في دلفي. في كل ملف مشروع ، يوجد رمز مشابه لما يلي:
application.createform (tform1 ، form1) ؛
تعريف طريقته:
الإجراء tapplication.createform (instanceclass: tcomponentClass ؛ var reference) ؛
var // Instanceclass هو مرجع فئة.
مثيل: tcomponent ؛
يبدأ
مثيل: = tcomponent (instanceclass.newinstance) ؛
{NewInstance Method Arting: Class NewInstance: toolject ؛ InstanceClass هو مرجع الفصل الذي ينفذ تعدد الأشكال على مستوى الفصل ، وبالتالي تحقيق إعادة استخدام الواجهة لإنشاء المكونات}
tcomponent (مرجع): = مثيل ؛
يحاول
مثيل
يستثني
tcomponent (مرجع): = nil ؛ // القضاء على المؤشر "البري"! جيد
يرفع؛
نهاية؛
{إذا كانت النافذة التي تم إنشاؤها ولا يوجد نموذج رئيسي حتى الآن ، فقم بتعيين النموذج الذي تم إنشاؤه للتو كنموذج رئيسي}
if (fmainform = nil) و (مثيل tform) ثم
يبدأ
tform (مثيل).
fmainform: = tform (مثيل) ؛ // اضبط النموذج الرئيسي
{ 实际上,在项目选项(project->options)中设置主窗体,实际上就把工程文件中相应的窗体语句提到所有创建窗体语句之前。 }
نهاية؛
نهاية؛
2) من أجل تعدد الأشكال لطريقة التدمير ، يرجى الرجوع إلى "تحليل الهيكل والدمار في دلفي" ، القسم 3.3
2.2 Tstrings
تعتبر معالجة صفيف السلسلة شائعة جدًا في أدوات التحكم في دلفي ، عادةً ما تكون بعض سمات العناصر مريحة بشكل خاص بالنسبة لنا لاستخدامها (لأنها تستخدم جميعها نفس الواجهة) ، وذلك بفضل تصميم بنية صفيف السلسلة في دلفي. هذا تصميم ناجح.
نظرًا لأن العديد من عناصر التحكم تستخدم صفائف السلسلة ، مثل Combobox و TStringGrid ، وما إلى ذلك ، ولكن صفائف السلسلة في كل عنصر تحكم مختلف ، تقوم Delphi بتجريد صفائف السلسلة ، وبالتالي تظهر العديد من الفئات ذات الصلة. يوفر Tstrings الفئة الأساسية فقط واجهة لمختلف المكالمات ، ويمكن تنفيذ التنفيذ المحدد بالكامل من فئاتها المشتقة.
دعونا نلقي نظرة على تعريف الطرق الشائعة لفئة Tstrings الفئة الأساسية (انظر سطر وحدة الفئات 442):
tstrings = فئة (tperSenceed)
محمية
...
وظيفة GET (الفهرس: عدد صحيح): سلسلة.
وضع الإجراء (الفهرس: integer ؛ const s: string) ؛
وظيفة getCount: عدد صحيح.
...
عام
إضافة (const s: string): integer ؛
{أضف سلسلة S إلى نهاية قائمة السلسلة}
الإجراءات الإجراءات (السلاسل: tstrings) ؛
{إضافة سلاسل إلى نهاية قائمة السلسلة}
إدراج الإجراء (الفهرس: integer ؛ const s: string) ؛
{طريقة الملخص ، أدخل سلسلة جديدة في موضع الفهرس}
الإجراء واضح.
{مسح جميع الأوتار}
حذف الإجراء (الفهرس: عدد صحيح) ؛
{حذف سلسلة في موقع معين}
فهرس الوظيفة (const s: string): integer ؛
{احصل على موضع s في قائمة السلسلة}
وظيفة indexofname (const اسم: string): integer ؛
{إرجاع موضع السلسلة الأولى مع اسم النموذج = القيمة مع جزء الاسم المحدد}
وظيفة indexofobject (AOBJECT: TOBJECT): integer ؛
{احصل على موضع الكائن مع الكائن المسمى AOBject: في قائمة السلسلة}
الإجراء loadfromfile (اسم ملف const: سلسلة) ؛
{يملأ القائمة بخطوط النص في ملف محدد}
الإجراء loadfromstream (تيار: tstream) ؛
{يملأ القائمة بخطوط نصية قراءة من دفق}
الإجراء SavetoStream (تيار: tstream) ؛
{يكتب قيمة خاصية النص إلى كائن دفق}
سلاسل الممتلكات [الفهرس: عدد صحيح]: القراءة احصل على الكتابة ؛
{تشير إلى الأوتار في القائمة من مواقعهم}
قيم الخصائص [اسم const: سلسلة]: سلسلة قراءة getValue اكتب setValue ؛
{يمثل جزء القيمة من السلسلة المرتبطة باسم معين ، على السلاسل مع اسم النموذج = القيمة.}
...
نهاية؛
من تعريف tstrings ، يمكن أن نرى أن معظم أساليبها المحمية والعامة هي طرق افتراضية أو أساليب مجردة. (الرجاء إضافة بعض ، tstringlist-> tstringGridString)
2.3 آخرون (الرجاء إضافة الروح)
إذا كنت لا تفهم تعدد الأشكال بعد ، فيرجى تذكر جوهر الأشكال:
"نفس التعبير ، العمليات المختلفة" (الأمر بسيط)
من منظور تنفيذ لغة OOP ، فإن تعدد الأشكال هو استخدام مؤشر/مرجع للفئة الأساسية لتشغيل الكائنات (الفئة المشتقة) ، وأداء طرق تشغيل مختلفة وفقًا للكائن الفعلي خلال فترة التشغيل ؛ بيان أكثر حيوية: يحتاج الكائن إلى طريقة التشغيل الخاصة به. نفسها. وهذا يتيح فصل الواجهات والتطبيقات ، مما يجعل إعادة استخدام الواجهة ممكنة.
في الواقع ، تعدد الأشكال بسيط! إذن ما الذي يجب أن تهتم به عند استخدام تعدد الأشكال؟下面我的两点几点建议:
قم بتحليل منطق العمل ، ثم الأشياء المتعلقة بالتجريد إلى "كائنات" ، ثم تغلف منطق العمل باستخدام أساليب الكائن. أعلن أن بعض العمليات ذات الأشكال الكلية كطرق افتراضية في الفئة الأساسية ، وأعلنها كطرق تجريدية افتراضية لأولئك الذين ليسوا ضرورية للتنفيذ في الفئة الأساسية ، ثم يحملها في فئاتها المستمدة. /مؤشرات الطبقة الأساسية عند استخدامها ، والتي تدرك بشكل طبيعي تعدد الأشكال في العالم الحقيقي. تذكر عدم تحقيق تعدد الأشكال من أجل تعدد الأشكال.
由于基类与派生类有一种天然“耦合”关系,修改基类就会导致“牵一发而动全身”,这将是非常麻烦的事情! لذلك ، يجب أن نحاول إضعاف التنفيذ الوظيفي للفئة الأساسية ، وتصميمه على أنه "فئة مجردة" إذا لزم الأمر ، وضمان واجهة مستقرة.
الأسئلة ذات الصلة
ناقش تعدد الأشكال في دلفي: http://www.delphhibbs.com/delphhibbs/dispq.asp؟lid=1753965
حول تعدد الأشكال: http://www.delphhibbs.com/delphhibbs/dispq.asp؟lid=1854895
ما هو تعدد الأشكال؟ ما هي الاستخدامات في البرمجة اليومية؟ http://www.delphibbs.com/delphibbs/dispq.asp؟lid=960465
ما هو الفرق بين التحميل الزائد والتجاوز؟ http://www.delphibs.com/delphibs/dispq.asp؟lid=296739
إصدار أن مؤشر الفئة المشتقة يشير إلى كائن الفئة الأساسية http://www.delphibs.com/delphibs/dispq.asp؟lid=2104106
(تم ذكر السؤال الأخير على Delphibbs عندما كنت أدرس بعمق تعدد الأشكال ، مما تسبب في مناقشة ساخنة. أقترح عليك إلقاء نظرة)