بـــســــــــــــــــم الله الرحمن الـــرحــــيـــم
قبل ما بلش بموضوع اليوم بدي اشكر الاخ علاء شكر خاص لانو ساعدني من خلال موضوعو (الفئة ناقصة الاهلية)باشياء كثيرة
وهدا رابط الموضوع اللي بنصح فيه كل مبتدء بحب يتعلم الجافا وخصوصا المبتدئين اللي ماسبق لهم تعلم اي لغة برمجة قبل الجافا
رح بلش بالموضوع وهوي من اهم اساسيات الجافا
مفهوم الوراثة
بصراحة كلمة وراثة لا تفي كليا بالغرض وذلك بسبب واقعنا السيئ
فكما يعلم الجميع ان الانسان يرث بعد موت احد والديه (اما ابوه او امه واحيانا يمكن ان يكون احد اقربائه كعمه او خاله )اي ان الانسان يحصل على الميراث بعد نهاية حيات شخص اخر
اما في الجافا فانه لايتطلب موت الفئة الاساسية لنتمكن من حصولنا على الميراث بل تبقى على وجه الحياة ويمكن ان نستفيد منها بشكل او بأخر
انني أقصد هنا ان الفثة الموروثة(التي نرث منها ) تبقى مفيدة لنا وذلك بسبب بقائها على وجه الحياة فيمكننا استخدامها واستدعائها دائما
هناك عدة امور واقعية في حياتنا تساعدنا على استيعاب مفهوم الوراثة في الجافا ومن ضمن هدا الامور هي السيارات
فلنتخيل اننا نعمل ضمن مصنع سيارات يقوم بتصنيع جميع انواع وماركات السيارات
فهدا التخيل يمكن تمثيله في الجافا من خلال التالي
نقوم بصناعة فئة اساسية (فئة الأب)ونسميها Car ثم نعطي هده الفئة خصائص مثل اللون ,الحجم,الاطارات,الفرامل,الشبابيك وغيرها
ثم نقوم بصنع سيارات على سبيل المثال مارسيدس و اوبل ونجعل هده السيارات ترث صفاتها من كلاس الاب من خلال الكلمة المفتاحية extends
فنتوصل الى مايلي
public class Car{
private String color;
private double volume;
private int windows; //لمعرفة عدد النوافد فرضا
public class(String color, double volume, int windows){
this.setColor(color);
this.setVolume(volume);
this.setWindowa(windows);
}
// طبعا منعمل get() and set() للمتغيراتالان نقوم بتصنيع سيارة من نوع مارسيدس والتي ترث صفاتها من الفئة الاب
public class Mercedes extends Car{
private boolean airbag; // خاصة الوسادة الهوائية
public Mercedes (String color, double volume, int windows, boolean airbag)
super(color, volume, windows);// هنا قمنا بوراثة اللون والحجم وعدد النوافد من الكلاس الاب ولذلك لا حاجنا لنا هنا بتعريف هذه المتغيرات وصنع السيت والجيت
this.setAirbag(airbag);
// ونقوم بكتابة get() and set() للمتغير aribag فقطوكذلك يمكننا صنع اكثر من سيارة كالاوبل والفيراري والبورش وغيرها وجعل السيارة ترث بعض الصفات من الفئة الاب
يأتي احدهم ليقول لي ان يمكن لنا استخدام الواجهة interface
وهدا الكلام ايضا صحيح ولكن الان سأقوم بشرح برنامج صغير من الصعب تشكيله عن طريق الواجهة
لنراجع سريعا مفهوم الفئة المجردة او ان يسمح لي الاخ علاء باسستخدام مفهوم الفئة ناقصة الاهلية والاسلوب ناقص الاهلية
نستطيع الاستفادة من الفئة ناقصة الاهلية والاسلوب ناقص الاهلية من خلال تعداد طرق كتابة وبرمجة هدا الاسلوب من فئة الى اخرى
اي ان هدا الاسلوب ناقص الاهلية يمكن مناداته في اكثر من فئة من فئات الابناء بحيت يختلف تمثيله وادائه من فئة الى اخرى وهدا مالايمكننا فعله من خلال الواجهة
وسوف ابين لكم ما اقصده من خلال هدا البرنامج الاتي
لنتخيل انه لدينا قشاط سحاب كالذي يستخدمونه في السوبر ماركت او المصانع لتمرير البضائع الى الماسح الضوئي لحساب سعر هده البضائع
ولتنخيل ايضا انه لدينا فقط نوعين من البضائع المختلفة في الشكل فمنها مربع ومنها الاسطواني
ولنتخيل ايضا اننا نملك ماسح ضوئي يقوم باعطائنا معلومات عن نوع البضاعة ورقمها وحجمها
مع الانتباه انه لكل بضاعة مربعة طول وعرض و ارتفاع ولكل بضاعة اسطوانية ارتفاع ونصف قطر
والان اطلب منكم تمثيل ماتخيلناه في الجافا
كــــــــــــيــــــــــــــــف؟؟؟؟؟؟؟؟؟؟
الطريقة كتير كتير سهلة ولكن تتطلب فهم ماقام الاخ علاء بشرحه (الفئة والاسلوب المجرد)ومفهوم الوراثة
لتمثيل البرنامج نبدء خطوة وبخطوة
اولا نقوم بصنع بضاعة بشكل عام والتي تملك رقم وارتفاع فمن خلال ماتخيلناه يتبين لنا ان جميع البضائع سواء كانت مربعة او اسطوانية لها رقم ولها ارتفاع
وبنفس الوقت تملك جحم ولكن هدا الحجم يختلف من بضاعة لاخرى فحجم المربع لايساوي حجم الاسطوانة
وهده البضاعة هي بمثابة الكلاس الاب الذي سنرث منه بعض الصفات
public abstract class Artefact {
private int id_Nr;
private double height;
public Artefact(int id_Nr, double height){ // دالة مشيدة تحمل الرقم والارتفاع
this.setId_Nr(id_Nr);
this.setHeight(height);
}
public int getId_Nr() {
return id_Nr;
}
public void setId_Nr(int id_Nr) {
this.id_Nr = id_Nr;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public abstract double getVolume(); // لقد جعلت هدا الاسلوب مجرد لان الية عمله ستختلف مابين المربع ولاسطوانة
}والان انا بحاجة الى ان اصنع بضائعي المربعة والاسطوانية
نبدء بالمربع
public class Crate extends Artefact{
private double length;
private double width;
public Crate(int id_Nr, double height, double length, double width){//
super(id_Nr, width);هنا نرى انني لم اقوم بتعريف الرقم والارتفاع وذلك لاننا نرثها من الفئة الاب
this.setLength(length);
this.setWidth(width);
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getVolume() //وهنا نقوم بوراثة الاسلوب المجرد من الفثة الاب ولكن نحننا نملك القدرة هنا برسم الية عمله
return (this.getWidth() * this.getLength()* this.getHeight());
}
}
وكذلك اقوم بصناعة البضاعة ذات الشكل الاسطواني ونجعلها ترث الرقم الارتفاع واسلوب الحجم من الكلاس الاب
public class Barrel extends Artefact{
private double radius;
public Barrel(int id_Nr, double height, double radius){// لقد قمنا باضافة خاصة نصف القطر فقط
super(id_Nr, height);
this.setRadius(radius);
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getVolume() {// وهنا يتبين لنا بان الية عمل هدا الاسلوب هنا يختلف عنه في الفئة المربعة رغم ورائة ذات الاسلوب ومن ذات الاب
return (Math.PI * (this.getRadius()*this.getRadius())* this.getHeight());
}
}والان يجب اكمال ما تخيلناه شو نحنا عم نلعب يعني بس منتخيل ;-)
منشان يكمل التخيل لازم نصنع ماسح ضوئي وقشاط لمرور البضائع عليه
public class Scanner {
public String scanner(Artefact a){
if (a instanceof Crate){// هنا نفحص البضاعة ازا كانت رباعية الشكل
return "Crate :" + a.getId_Nr() +" Volume : " + a.getVolume();
}
else if (a instanceof Barrel){هنا نفحص البضاعة ازا كانت اسطوانية الشكل
return " Barrel : " + a.getId_Nr()+ " Volume : " + a.getVolume();
}
return "";
}
}public class Conveyor {
public static void main(String []args){
Scanner s = new Scanner();
Barrel b = new Barrel(12345, 0.2, 0.3);
Crate c = new Crate(54321, 0.3, 0.4, 0.2);
System.out.println(s.scanner(b));
System.out.println(s.scanner(c));
}
}وهكدا نكون قد قمنا بما تخيلناه بشكل نهائي مع معرفة اهمية الوراثة وناقص الاهلية في لغتنا الجافا
اخيرا انا جاهز لالي استفسار عن الموضوع او البرنامج الذي تخيلناه سوية