الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه علاء الصالحي في 4 نوفمبر 2007 · 8 رد · 1,857 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أنقل لكم المقال هذا من مدونتي الخاصة الرابط

في هذا المقال حاولت التعديل على أسلوبي بحيث يكون أبسط

وحاولت إعطاء المقال صبغة عربية بحتة بعيدة كل البعد عن الترجمة والاقتباس

اللهم فإن أصبت فمن فضلك وإن أخطأت فمن نفسي ومن الشيطان

أترككم مع المقال

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

أية أسئلة على الموضوع أنا جاهز

أختم بدعاء كفارة المجلس

سبحانك اللهم وبحمدك استغفرك اللهم وأتوب إليك

وبالتوفيق

تم تعديل هذه المشاركة بواسطة alaadiaa في 4 نوفمبر 2007 في 07:21

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

أخي عبد الرحمن الواجهات لا تحل المشكلة المذكورة

وهي التالي

لو قلنا ما مساحة الرباعي

هل سيستطيع أحد مجاوبتنا

هل تستطيع تعريف طريقة method في الفئة رباعي تحسب لنا مساحة الرباعي

طبعاً لا لأن مساحة المستطيل لا تساوي مساحة المربع وهكذا

في المقابل من الصفات الأساسية في الرباعي أن يكون ذو مساحة

فما الحل؟

الواجهات يا دكتور لا تحل من البرمجة الكائنية سوى تعدد الوراثة

أما غير ذلك فهي تستخدم لتنظيم الحزم وترتيبها بشكل يسهل على المبرمجين فهمه

كما أنها تفيد في عمليات التجريد كأن أقول لك هناك فئة اسمها طابور تحتوي على عدد الموجودين في الطابور

وطريقة اسمها إدخال وأخرى اسمها إخراج دون ذكر تفاصيل عملية البناء الخاصة بها

عملية التجريد مهمة لتوصيف الكائنات في البرامج المتوسطة والكبيرة

على فكرة لا أعرف هل أجبتك على تساؤلك أم لا

الله معك

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

أعتقد يا دكتور أن alaadiaa كان عايز من الأول يشرح ال Abstarct Class وداه كان باين من عنوان الموضوع وأعتقد انه حط implementation لل toString علشان يوضح الموضوع بتاعه إنما هو في الآخر

Interface = Abstarct Class with All Methods are abstract

فإذا انتا ال Parent مش هتعرف ت implement أي ميثود فيها زي الحالة بتاعتك فخليها Interface

عرفت ت implement كل الميثودث الموجودة فخليها كلاس عادية

عرفت ت impolement ميثود والباقي لأ فخليها Abstract

وديه حالة alaadiaa هو حب يعمل implement للميثود بتاعة toString عام شوية ومعرفشي يعمل لل getArea لأنها هتختلف من نوع لنوع

أرجو اني أكون وضحت الفرق علشان الناس متتلخبطشي بس

#4

كيف حالك يا دكتور

يا رب نشوفك دايماً لحسن مشتاقينلك

أظن أن الأخ عمر ذكر لك أن المشكلة تكمن في getArea أنا أستطيع تعريف كل الطرق في الفئة الأب المسماة رباعي ما عداها

لأنها هي التي تختلف من فئة لفئة أما الباقي فيكون ثابت

بالنسبة للطريقة toString عرفت فهي لا تشكل أي مشكلة في البرنامج

لاحظ أخي أنا نتكلم عن لغة برمجة كائنية بمعنى أن عمليات التحايل مثل التحميل الزائد overloading قد تربك المبرمج في ما بعد

أنا أنتظر أسئلتك يا دكتور ولا تتحرج فأنا أخوك بإذن الله

شكراً للأخ عمر على فكرة وجودك معنا في المنتدى يسعدني جداً أخي الكريم

الله معكم

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

تحياتي لك أخي

الله معك

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

السلام عليكم ورحمة الله وبركاته ...

اشكرك في البداية أخ علاء على طرح موضوع الفئه المجرده في لغة الجافا ( Abstract ) وهي مفيده جداً في اختصار عمل الاكواد وتنظيمها ،

واستغلال فائدة الـ inheritance و الـ overloading اللتي تعتبر من خصائص الـ Object-Oriented Programming .

ومثالك على الاشكال كان موفق ، مثال : ان بعض الاشكال الهندسيه كالدائره والمربع والمستطيل لها مساحه ، لكن تختلف طريقة حساب المساحه من شكل لأخر ، لهذا السبب لاحظنا اشتراك الاشكال في المساحه ، واختلافها في طريقة الحساب ، لهذا السبب جردنا الداله getArea وجعلنا الحريه لـ subclass بكتابة الكود الخاص بحساب المساحه للشكل الحالي .

لكن نلاحظ ان الـ parameter للـمربع والمستطيل هو نفسه ، بحيث ان المساحه تتطلب الطول والعرض فقط لهذين الشكلين ، لكن عندما نريد حساب مساحة الدائرة ، نلاحظ ان الـ parameter سيختلف ، حيث انه سيكون نصف القطر فقط ! ، نستطيع في هذه الحاله ان نجعل هناك صنفين مجردين ( two abstract classes ) ، احدهم على سبيل المثال للاشكال الرباعيه ، والاخر للاشكال الدائرية ، وهما بنفس الوقت يعتبران subclasses لـ class Shape .

#7

هذا المنتدى قدم لي الكثير

فلن أبخل عليه بالقليل

لم أستطع أن أصل إلى النقطة التي تريد يا أخي private

بالنسبة للمربع فإنه لا يحتاج إلا إلى طول الضلع(سواء كان الأفقي أو العمودي) لأن أطوال أضلاعه متساوية

لا مانع بالطبع من جعل النوع المجرد شكل يرث بواسطة نوعين آخرين لمجرد أن تعرف أن هذا الشكل دائري أو رباعي لا أكثر

لكن ليس هناك مشاكل لو بقي النوع كما هو ويورث مباشرة بواسطة المربع أو الدائرة ...إلخ

هل وصلت لي المعلومة بشكل صحيح أم أنك أردت التحدث عن شيء آخر

الله معك

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

شكرا كتير اخ علاء بصراحة انا هلق فهمت ليش منستخدم الفئة المجردة

وعرفت من خلال الردود الاختلاف بين الفئات المجردة والانترفيس

مشكور مرة تانية على جهدك وطريقة توصيل المعلومة

على فكرة حلو تعبير ناقص الاهلية ;-)

#9

العفو قصي

وأي شيء يشكل عليك احنا في الخدمة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة