الوراثة او التوريث Inheritance هي احد العمليات التي توفرها الجافا الكائنية والتي تقوم بجعل احد ​الاصناف يأخذ صفات attributes و دوال/طرق methods صنف اخر.

مثلا نقوم بعمل نظام مدرسة فسيكون عندنا صنف للتلاميذ وصنف للاساتذة، اذا نظرنا سنجد ان الصنفيين يشتركون في مجموعة من الصفات مثل الاسم و تاريخ الميلاد، فبدلا من ان نكرر تعريف تلك الصفات في كلا الصنفين، نقوم بعمل صنف جديد وليكن “شخص” و نضع فيه الصفات المشتركة و نقوم بتوريث تلك الصفات الى كل من التلاميذ و الاساتذة.

عندما نقوم بعملية الوراثة نسمي الصنف الوريث ب الصنف الفرعي subclass او الصنف الابن child class.
اما الصنف الذي يورث نسميه الصنف الوالد/الاب parent class او الصنف الاعلى super class.

قواعد الكتابة Syntax

نستخدم كلمة extends لكي نجعل احد الاصناف يرث صنف اخر، وبذلك تنتقل كل الصفات و الطرق التي توجد في الصنف الوالد الى الصنف الابن

// نعرف الصنف الوالد
class ParentClass{
	
}

// نعرف الصنف الابن الذي يرث من الوالد
class ChildClass extends ParentClass{ // لامر التوريث extends تستخدم كلمة 
	
}

مثال

تشغيل
/* من الافضل تعريف الاصناف المختلفة في ملفات منفصلة */
class Car {
	
	public String model;
	
	public void drive(){
		System.out.println("driving....");
	}
}

class Volvo extends Car{
	
	public String safetySystem;
}

public class Main{
	public static void main(String[] args){
			
			Volvo v1 = new Volvo();
			v1.model	= "S60";
			v1.safetySystem = "6 AIRBAGS";
			v1.drive(); //  driving....
	}
}

كما لاحظنا في المثال السابق، الصنف Volvo يرث (inherit) من الصنف Car و بذلك استطعنا ان نصل الى كل الصفات و الطرق التي كانت في Car من الكائنات التي انشأناها من الصنف Volvo.

  • اي صنف نعرفه في الجافا ولا يرث اي لا يحتوي على extends، تقوم الجافا داخليا بجعله يرث صنف معرف مسبقا اسمه Object.
  • في الجافا، لا يستطيع اي صنف (class) ان يرث اكثر من صنف واحد
  • عندما نقوم بانشاء كائن من الصنف الابن، تقوم الجافا بانشاء كائن داخلي من صنف الاب/الوالد (parent) ويستطيع الكائن الابن بالوصول الى عناصر الكائن الاب.
  • اذا كانت احد صفات او طرق الاب مسبوقه بكلمة private لن يستطيع الكائن الابن الوصول لها.

final

final هي احد الكلمات المحجوزة (keyword) في لغة الجافا و نستطيع استخدامها مع الاصناف اذا اردنا ان نجعلها لا تورث اي ان تكون عقيمة فمثلا

final class Car{
	public String model;
}

الصنف من نوع Car في هذة الحالة لن نستطيع ان نورثه

class Volvo extends Car{	
}

الكود بالاعلى سيقوم باصدار Error لان الصنف الوالد/الاب مسبوق بكلمة final.

super

هي احد الكلمات الخاصة (keywords) في الجافا، وهي تشبه كلمة this لكن تستخدم للوصول الى الكائن من نوع الاب (parent) والتفرقة ما بين صفات (class) وطرق الصنف الاب و الابن اذا كانت اسمائهم متماثلة

مثال

تشغيل
class ParentClass{
	
	void run(){
		System.out.println("Run Parent...");
	}
	
	void move(){
		System.out.println("Move Parent...");
	}
	
	
}

class ChildClass extends ParentClass{
	void run(){
		System.out.println("Run Child...");

    super.run();
	}
}

class Main {
	public static void main(String[] args){
		
    ParentClass parent = new ParentClass();
    parent.run(); // Run Parent...
    parent.move(); // Move Parent...

		ChildClass child = new ChildClass();
		child.run(); // Run Child... Run Parent...
    child.move(); // Move Parent...
	}

}

كما لاحظنا استطعنا ان نصل الطريقة الاب run باستخدام كلمة super.

ملحوظة: عندما استخدم صفات او طرق بنفس الاسم مثل صنف الاب (parent class) يسمى هذا التجاوز (overriding). حيث يصبح الكود الذي ينفذ هو الكود في الصنف الابن (child class).

تستخدم ايضا كلمة super مع دالة البناء اذا اردنا ان نستخدم احد دالات بناء الصنف الاب

تشغيل
class ParentClass{
	int parentCounter;
	ParentClass(int counter){
		parentCounter = counter;
	}
}

class ChildClass extends ParentClass{
	int childCounter;
	
	ChildClass(int counter1, int counter2){
		super(counter1);
		
		childCounter = counter2;
	}
}



class Main {
	public static void main(String[] args){
		
    ChildClass child = new ChildClass(1,2);
	
	System.out.println(child.parentCounter); // 1
	System.out.println(child.childCounter); // 2
	
	}
}
  • يجب ملاحظة عند استخدام super في دالة البناء، يجب ان تكون اول امر يتم منادته.
  • في حالة اننا لم نستخدم كلمة super، تقوم الجافا داخليا بمنادة دالة البناء الافتراضية للصنف الوالد (parent class).
  • في حالة اننا قمنا بتعريف دالة بناء تاخذ وسطاء (parameter) في الوالد مثل المثال السابق ولم نعرف دالة افتراضية للصنف الوالد، يجب علينا اذا قمنا بانشاء صنف ابن بان نتسخدم كلمة super مثل المثال السابق.

guest
0 تعليقات
Inline Feedbacks
اظهر كل التعليقات