(الجزء 3 من "وضع الأفكار الموجهة للكائنات في كل مكان - الحديث عن تطوير دلفي")
ناقشت المادتان الأوليان موضوعات تتعلق بالتغليف. وهنا أريد أن أتحدث إليكم عن الميراث وتعدد الأشكال.
ترتبط الميراث وتعدد الأشكال ارتباطًا وثيقًا. يقدم Object Pascal آلية متعددة الأشكال تسمى التحميل الزائد، وفكرتها لا علاقة لها بالكائنات الموجهة ولن تتم مناقشتها هنا. إن تعدد الأشكال، الذي يرتبط ارتباطًا وثيقًا بالتفكير الشيئي، هو ما نركز عليه.
ويعتمد تعدد الأشكال على مفاهيم الطرق المجردة والأساليب الافتراضية، كما أنه يرتبط ارتباطًا وثيقًا بالميراث. يُعتقد أننا غالبًا ما نحدد بعض الكائنات الأساسية ثم نحدد بعض تطبيقاتها على أنها مجردة، مما يعني أننا نحدد الواجهة فقط دون تحديد تفاصيل تنفيذ محددة. باتباع هذه الفكرة، سنقوم أيضًا بتعريف كائنات مشتقة (موروثة) متعددة، حيث يتم بالفعل تنفيذ التفاصيل التي لم يتم تنفيذها في فئة السلف. وهذا يجعل الفئة الأساسية التي حددناها سابقًا متعددة الأشكال. ميزة هذه الآلية هي أننا عندما نستخدم هذه الفئات، نحتاج فقط إلى مجموعة واحدة من التعليمات البرمجية لإكمال وظائف متعددة. الشيء الوحيد الذي يحتاج إلى التغيير هو الجزء الذي ينشئ مثيلًا للكائن.
مراقبة فئة مثل هذا:
TStream = فئة (TObject)
…
عام
وظيفة القراءة (var Buffer؛ Count: Longint): Longint virtual؛
وظيفة الكتابة (const Buffer؛ Count: Longint): Longint virtual؛
…
نهاية؛
تشير الكلمات المحجوزة الافتراضية والمجردة إلى أن أساليب القراءة والكتابة هي وظائف افتراضية خالصة. يوضح هذا أنه لا يمكن استخدام فئة TStream حقًا (لا يمكن إنشاء مثيلات لهذه الفئة)، إنها مجرد فئة مشابهة للواجهة، والتي تحدد الوظائف الأساسية التي يجب أن تمتلكها فئة TStream وتحتاج إلى التعامل معها. وينص أيضًا على أن الفئات الأخرى المشتقة من فئة TStream يجب أن تنفذ وظائف (مثل القراءة والكتابة وما إلى ذلك).
على سبيل المثال، يقوم TFileStream بتنفيذ فئة TStream في شكل تطبيقات ملفات القرص، بينما يقوم TMemoryStream بتنفيذ فئة TStream في شكل تطبيقات ذاكرة. لنفترض الآن أن هناك فئة TMyClass توفر طريقة SaveToStream:
TMyClass = فئة (TObject)
PROcedure SaveToStream(Stream: TStream);
نهاية؛
ثم بتطبيق فكرة تعدد الأشكال، يمكنك الحصول على كود مثل هذا:
فار
strm: TStream؛
ماي كلاس: تمي كلاس؛
يبدأ
strm := TFileStream.Create('abc.txt'); // ß نوع المثيل الحقيقي للدفق هنا هو TFileStream
MyClass := TMyClass.Create;
MyClass.SaveToStream(strm);
…..
نهاية؛
لتخزين محتويات MyClass في الذاكرة، ما عليك سوى التغيير
strm := TFileStream.Create('abc.txt');
ل:
strm := TMemoryStream.Create;
هذا كل شيء.
يتطلب استخدام تعدد الأشكال جانبين من العمل، أحدهما، بالطبع، أن يتم أخذ تعدد الأشكال في الاعتبار في بنية الفصل ويمكن أن يوفر فئات وسيطة (فئات مجردة) تنفذ وظائف معينة، والآخر هو معرفة كيفية استخدام هذه الوسائط الطبقات. وينعكس هذا العمل في تحديد بعض الإجراءات ومعلمات الوظائف.
نقطة أخرى مهمة جدًا، أود أن أذكر الجميع أن التخطيط الصفي مهم جدًا في عصر البرمجة الشيئية، يحدد إطار الفصل إطار البرنامج إلى حد كبير ويحدد نجاح أو فشل تطوير البرمجيات. إن بنية الطبقة الواضحة والهرمية لا تسهل فقط التقسيم الوظيفي والتوسع، ولكنها تجعل أيضًا صيانة التعليمات البرمجية أسهل. من بين هذه الطرق، تطبيق أفكار الميراث وتعدد الأشكال، وإدخال الطبقات المجردة، وإدخال الطبقات المتوسطة هي الطريقة الأكثر تفضيلاً.
فيما يلي قائمة ببعض الفئات المجردة والفئات الملموسة المتوفرة في دلفي:
فئة ملموسة مشتقة من فئة مجردة
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile، TMemIniFile، TRegistryIniFile؛
TStrings TStringList، TMemoStrings، TListBoxStrings؛
وهناك الكثير غيرها، في انتظار أن نكتشفها أنا وأنت. الأكثر استخدامًا هنا هو TStream، وأكثر ما يفاجئني هو TCustomIniFile، حيث يسمح لك TRegistryIniFile بالوصول إلى السجل بنفس طريقة IniFile! يتيح لي هذا استخدام مجموعة من الأكواد لتنفيذ وظائف كتابة السجل وكتابة ملفات Ini. على الرغم من أن التكنولوجيا المستخدمة بسيطة، إلا أن أهميتها غير عادية!
(لم يكتمل، يتبع)
المزيد من المقالات