في البداية أريد أن أتكلم عن ناقص الأهلية لأوضح معنى الكلمة وسبب اختياري لها كترجمة لـ abstract
ناقص الأهلية هو من يقضي فلا يتعرف عليه أحد ولا يوجد في حوزته ما يدل على هويته
وهذا يجعله أقل من الناس العاديين كأن يسمح لطلاب كلية الطب بتشريحه أو الدراسة عليه أو ماشابه
السبب في اختياري هذا المصطلح أن الفئة المجردة تعتبر ناقصة الحقوق فليس لها الحق في بناء كائنات ما لم يتعرف عليها أحد أقصد يكمل الوظائف التي جعلتها ناقصة الأهلية كما أن الوظيفة method المجردة تعتبر ناقصة الحقوق لعدم وجود جسم body لها
لكي نفهم أهمية الفئة ناقصة الأهلية(المجردة) abstract نطرح المثال التالي:
معلوم لدينا أن المستطيل والمربع و متوازي الأأضلاع والمعين كلها عبارة عن أشكال رباعية في الحياة الطبيعية عندما نفكر
في عمل تحوير mapping لها إلى لغة برمجة كائنية object oriented language كالجافا فإننا سنقوم بإنشاء فئة اسمها رباعي سيرثها المستطيل والمربع إلخ بالطبيعي أنك عندما تتكلم عن مستطيل فإنك تتكلم عن شكل رباعي أما لو تكلمنا عن رباعي فلربما كان المربع أو المستطيل أو غيره لنركز الآن على الرباعي لو قلنا ما مساحة الرباعي
هل سيستطيع أحد مجاوبتنا
هل تستطيع تعريف طريقة method في الفئة رباعي تحسب لنا مساحة الرباعي
طبعاً لا لأن مساحة المستطيل لا تساوي مساحة المربع وهكذا
في المقابل من الصفات الأساسية في الرباعي أن يكون ذو مساحة
فما الحل؟
الحل أن أجعل الرباعي يجبر جميع أبناءه على أن يقوموا بتعريف الطريقة getgetArea التي تحسب المساحة كل على حسب مساحته
سنقوم بذلك عن طريق كتابة abstract
public abstract double getArea();
بعد أن قمنا بتعريف getArea على أنها abstract method هل يعقل أن نقوم بإنشاء Object من الفئة رباعي
لو فرضنا جدلاً أن ذلك ممكن ماذا سنحصل عليه عند استخدام الطريقة السابقة
لحل هذه المشكلة فإننا لن نستطيع إنشاء كائن من النوع رباعي
ماذا عن أبناء الأخ رباعي ماذا سيحصل لهم
ستفرض عليهم الإقامة الجبرية تحت إمرة الأخ abstract حتى نقوم بتعريف الطريقة السابقة فيهم
وإلا سنضطر إلى جعلهم مثل أبيهم abstract
الآن نكتب بعض الشيفرات لكي يتضح المعنى العام من الموضوع بالطبع
نبدأ بالفئة رباعي
/** * @(#)Quadruple.java * * * @author * @version 1.00 2003/1/1 */ public abstract class Quadruple { public Quadruple() { } public abstract double getArea(); public String toString() {return String.format(" The Quadruple is "); } } // end class Quadruple
ثاني فئة فئة المستطيل
/** * @(#)Rect.java * * * @author * @version 1.00 2003/1/1 */ public class Rect extends Quadruple{ private double A ; private double B ; public Rect(double a , double b) { setA(a); setB(b); } public void setA(double a) { if (a > 0) this.A=a; else this.A=0; } public double getA() {return A; } public void setB(double b) { if (b > 0) this.B=b; else this.B=0; } public double getB() {return B; } public double getArea() {double getArea = (double)(A*B); return getArea; } public String toString() {return String.format("%s Rectangle n A = %.2f t B = %.2f n getArea = %.2f nn" , super.toString() , getA(), getB(), getArea()); } } // end class Rect
ثالث فئة فئة المربع
/** * @(#)Square.java * * * @author * @version 1.00 2003/1/1 */ public class Square extends Quadruple{ private double A ; public Square(double a) { setA(a); } public void setA(double a) { if (a > 0) this.A=a; else this.A=0; } public double getA() {return A; } public double getArea() {double getArea = (double)(A*A); return getArea; } public String toString() {return String.format("%s Square n A = %.2f n getArea = %.2f nn" , super.toString() , getA(), getArea()); } } // end class Square
رابع فئة فئة الدائرة
/** * @(#)circle.java * * * @author * @version 1.00 2003/1/1 */ public class circle extends Quadruple{ private double A ; public circle(double a) { setA(a); } public void setA(double a) { if (a > 0) this.A=a; else this.A=0; } public double getA() {return A; } public double getArea() {double getArea = (double)(A*A)*(22/7); return getArea; } public String toString() {return String.format("%s Circle n r=%.2f n getArea = %.2f nn" , super.toString() , getA(), getArea()); } }// end class circle
نلاحظ أن كلاً من الدائرة والمستطيل والمربع لا تتبع abstract وذلك لوجود الطريقة getArea فيها
أية أسئلة على الموضوع أنا جاهز
إن أخطأت فمن نفسي ومن الهوى
وإن أصبت فمن الله
سبحانك اللهم وبحمدك استغفرك اللهم وأتوب إليك
وبالتوفيق
Hello! Good Site! Thanks you!
You are welcome
Eng. Alaa AL-Salhi
موضوع جميل جداً وانا استفدت منه الكثير
اريد شرح انواع الميثود abstract, base, template وامثلة عليها
إذا أمكن
لا أعلم ما هي الميثود base
بالنسبة لـ template فهي من أولياتي
سأحاول أن أفعل في أقرب فرصة
تحياتي
Thanks you!
You are welcome
any question
regards
شكرا جزيلا وشرح مبسط ولذيذ
العفو و أتمنى أن تكون استفدت منه
لو لديك أي ملاحظات أتشرف لو أرسلتها لي
تحياتي
جزاك الله خير على هذا الشرح الوافي
ولي طلب بسيط إن شاء الله تقدر عليه 🙂
ممكن تشرح طريقة interface وما الفرق بينها وبين abstract في موضوع الوراثة !!
تحياتي لك
سأحاول بإذن الله
تحياتي
مرحبا كيفكم انا عاوزة برنامج يحسب مساحة المستطيل بلغة جافا
عاوزته اليوم ضروري جدا بليز تبعتوا على الايميل لاني كتير ضروري عاوزته بكرا عندي امتحان في هاد البرنامج
أعتذر منك أخت حياة
يجب عليك أن تعتمدي على نفسك في أداء واجباتك
تحياتي
السلام عليكم
حياك الله اخي علاء
لكن عندي سؤال انا بالاخر شو استفدت من الميثود get area في الابستراكت بما اني رجت عرفتها في الكلاس الابن ؟؟؟ يعني كان بامكاني ني ما اعرفها في السوبر وارجع اعرفها في كلاس الابن..
الأمر هين لك لو كنت تعمل على برنامج عادي
لكن ماذا لو كنت تعمل على حزمة library سيستخدمها آخرون من بعدك
وتريد إجبار المستخدم للحزمة أن يعرف الدالة هذه
هنا تكمن قوة الفئة المجردة (بوجهة نظر أعم الواجهة interface على فرض أن الواجهة هي تعميم للفئة المجردة لكنها لا تحتوي على أي دوال معرفة كاملاً)
هل وصلت الفكرة؟
تحياتي
YAS
thanks
يعطيك العافية أخوي
شكرا جزيلا لك ..