الفئة ناقصة الأهلية(المجردة)

في البداية أريد أن أتكلم عن ناقص الأهلية لأوضح معنى الكلمة وسبب اختياري لها كترجمة لـ 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 فيها
أية أسئلة على الموضوع أنا جاهز
إن أخطأت فمن نفسي ومن الهوى
وإن أصبت فمن الله
سبحانك اللهم وبحمدك استغفرك اللهم وأتوب إليك
وبالتوفيق

16 Responses to “الفئة ناقصة الأهلية(المجردة)”

  1. camoflsomv قال:

    Hello! Good Site! Thanks you!

  2. admin قال:

    You are welcome
    Eng. Alaa AL-Salhi

  3. salah alrashed قال:

    موضوع جميل جداً وانا استفدت منه الكثير

    اريد شرح انواع الميثود abstract, base, template وامثلة عليها
    إذا أمكن

  4. admin قال:

    لا أعلم ما هي الميثود base
    بالنسبة لـ template فهي من أولياتي
    سأحاول أن أفعل في أقرب فرصة
    تحياتي

  5. admin قال:

    You are welcome
    any question

    regards

  6. محمد فؤاد قال:

    شكرا جزيلا وشرح مبسط ولذيذ

  7. admin قال:

    العفو و أتمنى أن تكون استفدت منه
    لو لديك أي ملاحظات أتشرف لو أرسلتها لي

    تحياتي

  8. فيصل قال:

    جزاك الله خير على هذا الشرح الوافي

    ولي طلب بسيط إن شاء الله تقدر عليه :-)

    ممكن تشرح طريقة interface وما الفرق بينها وبين abstract في موضوع الوراثة !!

    تحياتي لك

  9. admin قال:

    سأحاول بإذن الله

    تحياتي

  10. hayat قال:

    مرحبا كيفكم انا عاوزة برنامج يحسب مساحة المستطيل بلغة جافا
    عاوزته اليوم ضروري جدا بليز تبعتوا على الايميل لاني كتير ضروري عاوزته بكرا عندي امتحان في هاد البرنامج

  11. admin قال:

    أعتذر منك أخت حياة
    يجب عليك أن تعتمدي على نفسك في أداء واجباتك

    تحياتي

  12. معتز قال:

    السلام عليكم
    حياك الله اخي علاء
    لكن عندي سؤال انا بالاخر شو استفدت من الميثود get area في الابستراكت بما اني رجت عرفتها في الكلاس الابن ؟؟؟ يعني كان بامكاني ني ما اعرفها في السوبر وارجع اعرفها في كلاس الابن..

  13. admin قال:

    الأمر هين لك لو كنت تعمل على برنامج عادي
    لكن ماذا لو كنت تعمل على حزمة library سيستخدمها آخرون من بعدك
    وتريد إجبار المستخدم للحزمة أن يعرف الدالة هذه
    هنا تكمن قوة الفئة المجردة (بوجهة نظر أعم الواجهة interface على فرض أن الواجهة هي تعميم للفئة المجردة لكنها لا تحتوي على أي دوال معرفة كاملاً)
    هل وصلت الفكرة؟

    تحياتي

  14. khalloud قال:

    يعطيك العافية أخوي
    شكرا جزيلا لك ..

Leave a Reply