إن Abstractclass والواجهة هما آليتان في لغة Java تدعمان تعريفات الفئات المجردة. وبسبب وجود هاتين الآليتين على وجه التحديد، تم منح Java إمكانات قوية موجهة للكائنات. هناك أوجه تشابه كبيرة بين الفئة المجردة والواجهة من حيث دعم تعريف الفئة المجردة، ويمكن حتى استبدالها ببعضها البعض، لذلك يبدو أن العديد من المطورين يتعاملون بشكل غير رسمي مع اختيار الفئة المجردة والواجهة عند تعريف الفئات المجردة. في الواقع، لا يزال هناك فرق كبير بين الاثنين، بل إن اختيارهما يعكس فهم طبيعة مجال المشكلة وما إذا كان فهم نية التصميم صحيحًا ومعقولًا. ستحلل هذه المقالة الاختلافات بينهما وتحاول تزويد المطورين بأساس للاختيار بين الاثنين.
فهم الطبقات المجردة
يتم استخدام كل من Abstractclass والواجهة لإنشاء فئات مجردة في لغة Java (لم تتم ترجمة الفئة المجردة في هذه المقالة من فئة مجردة، فهي تمثل نصًا مجردًا، وفئة مجردة هي طريقة تستخدم لتحديد الفئات المجردة في لغة Java)، والقراء يرجى الانتباه للتمييز) التعريف، ثم ما هي الفئة المجردة، وما هي الفوائد التي يمكن أن يجلبها لنا استخدام الفئات المجردة؟
في المفهوم الشيئي، نعلم أن جميع الكائنات ممثلة بفئات، لكن العكس ليس صحيحا. لا يتم استخدام كافة الفئات لوصف الكائنات. إذا كانت الفئة لا تحتوي على معلومات كافية لوصف كائن معين، فإن هذه الفئة تعتبر فئة مجردة. غالبًا ما تُستخدم الفصول المجردة لتمثيل المفاهيم المجردة التي نستمدها من تحليل وتصميم مجالات المشكلات، فهي عبارة عن تجريدات لسلسلة من المفاهيم المحددة التي تبدو مختلفة ولكنها في الأساس متماثلة. على سبيل المثال: إذا قمنا بتطوير برنامج لتحرير الرسومات، سنجد أن هناك بعض المفاهيم المحددة مثل الدوائر والمثلثات في مجال المشكلة، ولكنها جميعها تنتمي إلى مفهوم الشكل في مجال المشكلة، إذا كان موجودا، فهو مفهوم مجرد. هذا على وجه التحديد لأن المفاهيم المجردة لا تحتوي على مفاهيم ملموسة مقابلة في مجال المشكلة، لذلك لا يمكن إنشاء مثيل للفئات المجردة المستخدمة لتمثيل المفاهيم المجردة.
في المجال الكائني، تُستخدم الفئات المجردة بشكل أساسي لإخفاء النوع. يمكننا بناء وصف مجرد لمجموعة ثابتة من السلوكيات، ولكن هذه المجموعة من السلوكيات يمكن أن يكون لها أي عدد من التطبيقات الملموسة الممكنة. هذا الوصف المجرد هو فئة مجردة، وهذه المجموعة من أي تطبيقات ملموسة محتملة يتم تمثيلها من خلال جميع الفئات المشتقة الممكنة. يمكن للوحدات أن تعمل على جسم مجرد. نظرًا لأن الوحدة تعتمد على تجريد ثابت، فلا يمكن تعديلها في نفس الوقت، ويمكن أيضًا توسيع سلوك هذه الوحدة من خلال الاشتقاق من هذا التجريد. يجب على القراء الذين هم على دراية بـ OCP أن يعرفوا أنه من أجل تحقيق OCP (مبدأ مفتوح مغلق)، وهو أحد المبادئ الأساسية للتصميم الموجه للكائنات، فإن الفئات المجردة هي المفتاح.
النظر إلى الفئة المجردة والواجهة من مستوى التعريف النحوي
على المستوى النحوي، توفر لغة Java تعريفات مختلفة للفئة المجردة والواجهة، وفيما يلي مثال على تعريف فئة مجردة تسمى Demo لتوضيح هذا الاختلاف.
طريقة تحديد الفئة المجردة التجريبية باستخدام فئة مجردة هي كما يلي:
من منظور البرمجة، يمكن استخدام كل من الفئة المجردة والواجهة لتنفيذ فكرة "designbycontract". ومع ذلك، لا تزال هناك بعض الاختلافات في الاستخدام المحدد.
بادئ ذي بدء، تمثل فئة مجردة علاقة الميراث في لغة جافا، ويمكن للفصل استخدام علاقة الميراث مرة واحدة فقط. ومع ذلك، يمكن للفئة تنفيذ واجهات متعددة. ربما يكون هذا بمثابة حل وسط من قبل مصممي لغة Java عند النظر في دعم Java للميراث المتعدد.
ثانيًا، في تعريف الفئة المجردة، يمكننا تعيين السلوك الافتراضي للطريقة. ولكن في تعريف الواجهة، لا يمكن أن يكون للطرق سلوك افتراضي، ومن أجل التحايل على هذا التقييد، يجب استخدام المفوضين، لكن هذا سيضيف بعض التعقيد ويسبب في بعض الأحيان الكثير من المتاعب.
هناك مشكلة خطيرة أخرى تتمثل في عدم القدرة على تحديد السلوك الافتراضي في فئة مجردة، وهي أنها قد تسبب مشكلة في الصيانة. لأنه إذا أردت لاحقًا تعديل واجهة الفصل (عادةً ما يتم تمثيلها بواسطة فئة مجردة أو واجهة) للتكيف مع المواقف الجديدة (على سبيل المثال، إضافة أساليب جديدة أو إضافة معلمات جديدة إلى الأساليب الموجودة)، فسيكون ذلك مزعجًا للغاية، وقد يكون الأمر كذلك يستغرق الأمر الكثير من الوقت (خاصة عندما يكون هناك العديد من الفئات المشتقة). ولكن إذا تم تنفيذ الواجهة من خلال فئة مجردة، فقد تحتاج فقط إلى تعديل السلوك الافتراضي المحدد في فئة مجردة.
وبالمثل، إذا لم يكن من الممكن تحديد السلوك الافتراضي في فئة مجردة، فسيظهر تنفيذ نفس الطريقة في كل فئة مشتقة من الفئة المجردة، مما ينتهك مبدأ "قاعدة واحدة، مكان واحد"، مما يؤدي إلى تكرار التعليمات البرمجية، وهو أمر غير مناسب أيضًا إلى الصيانة المستقبلية. لذلك، كن حذرًا جدًا عند الاختيار بين فئة مجردة والواجهة.
النظر إلى الفئة المجردة والواجهة من منظور مفاهيم التصميم، يناقش ما ورد أعلاه بشكل أساسي الاختلافات بين الفئة المجردة والواجهة من منظور التعريف النحوي والبرمجة، والاختلافات في هذه المستويات منخفضة نسبيًا وغير ضرورية. سيقوم هذا القسم بتحليل الفرق بين فئة مجردة والواجهة من مستوى آخر: مفاهيم التصميم التي يعكسها الاثنان. يعتقد المؤلف ذلك