1.لا توجد علاقة مباشرة بين مفهوم الAbstraction اللي هو العمود الرابع المنسي في اعمدة الOOP بجانب الPolymorphism و الInheritance و الEncapsulation. و بين الAbstract Class او الAbstract Method. (سلسلة عن الاثنين)
2.الAbstraction هنا يعني التبسيط او التفكيك, لما نبسط مشكلة معقدة. مثلاً لو نصمم برنامج إدارة فواتير , الفاتورة تظهر بسيطة لكن فعلياً معقدة لأن فيها اشياء كثيرة غير متجانسة مثل معلومات العميل و عنوانه والمنتجات .. الخ. فهنا نبسط المشكلة بعلاقة Has-A ( لديه او يحتوي على .. )
3.تبسيط الفاتورة او تفكيكها يتم بأن نقول أن كلاس Invoice لديه Address (كلاس) و لديه ايضاً Customer كلاس اخر و لديه مجموعة Collection كلاسات من نوع Item مثلاً و هكذا. هذا التفكيك او الAbstraction هو اول مراحل التحليل و التصميم في الOOP. فالAbstraction مجرد مفهوم للتصميم.
4.الAbstract Class شيء حقيقي في الكود هو كلاس حقيقي . ممكن تتخيله مثل قالب Template للكلاسات , كأنه عقد او بروتوكول , يقول لازم اي كلاس يورث مني ضروري يكون بهذا الشكل و فيه هذي المتغيرات و فيه هذي الميثود بدون مايحدد قيم او كيف تعمل الميثود.
5.احياناً ممكن يحدد Implementation لكن ممكن الكلاس اللي يورثه يغير. اذا ماحدد عمل الmethod فبيكون abstract method. صعب التعميم هنا لأن كل لغة لها طريقتها و لغات كثيرة ماعندها هذا المفهوم خصوصا اللي Dynamically typed . مع انه في اشياء مشابهة مثل الTraits و الMixins.
6.بعض اللغات تسميه Skeletal ( هيكل عظمي ) قد يكون فيه Implementation بعكس الInterface اللي مافيها.
الInterface هي في الأصل ايضاً Abstract Class للغات اللي ماتدعم الMultiple Inheritance كألتفاف على مشكلة الDiamond of Death.
الInterface هي في الأصل ايضاً Abstract Class للغات اللي ماتدعم الMultiple Inheritance كألتفاف على مشكلة الDiamond of Death.
7.شيء مهم اخر ان الAbstract Class كلاس لا تستطيع عمل Initiating له بمعنى ما تقدر تنشيء منه Objects لانه مجرد قالب. الAbstract كلاس مهم لتمكين الPolymorphism و Inheritance
ممكن تراجع سلسلة تغريداتي عن الDynamic Dispatch.
ممكن تراجع سلسلة تغريداتي عن الDynamic Dispatch.
8.المفهوم اول ماظهر كان في لغة Simula لكن بدون كلمة abstract لكن يعرف لما نشوف كلاس فيه ميثود نوعها virtual
نفس طريقة ++C او بالاحرى ++C هي اللي اخذت من Simula. لكن لغات مثل جافا و سي شارب تصرح بكلمة abstract.
نفس طريقة ++C او بالاحرى ++C هي اللي اخذت من Simula. لكن لغات مثل جافا و سي شارب تصرح بكلمة abstract.
9.مثال لو تصمم نظام HR و عندك موظفين لهم مسميات وظيفية مختلفة مثل Manager و Supervisor و Labor في الأخير كلهم Employee الوظائف السابقة او حتى الجديدة كلهم يشتركون في اشياء موحدة ان لهم Title و Name و لهم ميثود CalculateSalary يختلف كود احتساب الراتب حسب الوظيفة لكن وجودها ضروري.
10.فبتنشيء Abstract Class كـ Base Class ( أب ) فيه Title و Name و فيه ميثود CalculateSalary لكن بدون كود Implementation. الكود تكتبه في ال derived classes المتورثة من الكلاس الأصلي مثل Manager و Labor و في كل كلاس تكتب الكود المناسب لاحتساب طريقة الراتب في ميثود CalculateSalary.
11.مهم بدل ما تعتمد على اللي فهمته او قرأته فقط انك تستفيد من الDesign Patterns مثل الTemplate Method أو
Strategy او الـDecorator مع الAbstract Class او الInterface كذا بتفهم الاثنين الAbstract Class و بعض الDesign Patterns. و بالتوفيق.
Strategy او الـDecorator مع الAbstract Class او الInterface كذا بتفهم الاثنين الAbstract Class و بعض الDesign Patterns. و بالتوفيق.