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