السبت، 4 يناير 2020

الوراثة في جافا البرمجة الكائنية التوجه Java Inheritance oop

الوراثة في جافا البرمجة الكائنية التوجه

  Java Inheritance oop

الوراثة في جافا البرمجة الكائنية التوجه  Java Inheritance oop

يمكن تعريف الوراثة بأنها العملية التي يكتسب فيها أحد الصفات خصائص (دوال وحقول) فئة أخرى.  مع استخدام الميراث ، أصبحت المعلومات قابلة للإدارة بترتيب هرمي.

 يُعرف الفصل الذي يرث خصائص الآخر بالفئة الفرعية (الفئة المشتقة ، والفئة الفرعية) والفئة التي توارث خصائصها تعرف باسم الطبقة الفائقة (الفئة الأساسية والفئة الرئيسية).

الكلمة المحجوزة يمتد extends Keyword

يمتد هو الكلمة الأساسية المستخدمة في وراثة خصائص فئة.  فيما يلي بناء الجملة يمتد الكلمة.
الصيغة Syntax
class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

مثال Sample Code

فيما يلي مثال يوضح توارث Java.  في هذا المثال ، يمكنك ملاحظة فئتين هما الحساب و My_Calculation.

 باستخدام الكلمة الأساسية الموسعة ، يرث My_Calculation طرق الجمع () والطرح () لفئة الحساب.

 انسخ والصق البرنامج التالي في ملف باسم My_Calculation.java
مثال Example

class Calculation {
   int z;
 
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
 
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
 
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}

تجميع وتنفيذ الكود أعلاه كما هو موضح أدناه.
javac My_Calculation.java
java My_Calculation
بعد تنفيذ البرنامج ، سوف ينتج النتيجة التالية -
المخرجات Output
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
في البرنامج المحدد ، عندما يتم إنشاء كائن إلى فئة My_Calculation ، يتم إنشاء نسخة من محتويات الفئة  الفائقة بداخله.  لهذا السبب ، باستخدام كائن الفئة الفرعية ، يمكنك الوصول إلى أعضاء الفئة الفائقة.
Inheritance
يمكن للمتغير المرجعي Superclass أن يحتفظ بكائن الفئة  الفرعية ، ولكن باستخدام هذا المتغير يمكنك الوصول فقط إلى أعضاء الفئة  الفائقة ، لذلك للوصول إلى أعضاء كل من الفئتين ، يوصى دائمًا بإنشاء متغير مرجعي للفئة الفرعية.

 إذا كنت تفكر في البرنامج أعلاه ، يمكنك إنشاء مثيل الفئة  كما هو موضح أدناه.  ولكن باستخدام متغير مرجع الفئة  العليا (كال في هذه الحالة) ، لا يمكنك استدعاء طريقة الضرب () ، التي تنتمي إلى الفئة الفرعية My_Calculation.
Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
ملاحظة - ترث فئة فرعية جميع الأعضاء (الحقول والأساليب والفئات المتداخلة) من الفئة الفائقة.  المُنشئون ليسوا أعضاءً ، لذلك لا يتم توارثهم بواسطة الفئات الفرعية ، ولكن يمكن استدعاء مُنشئ الطبقة الفائقة من الطبقة الفرعية.

الكلمة المحجوز الفائقة او العليا او سوبر The super keyword

الكلمة الرئيسية الفائقة تشبه هذه الكلمة الرئيسية.  فيما يلي السيناريوهات التي يتم فيها استخدام الكلمة الأساسية الفائقة.

 يتم استخدامه لتمييز أعضاء الفئة  الفائقة عن أعضاء الفئة الفرعية ، إذا كان لديهم نفس الأسماء.

 يتم استخدامه لاستدعاء منشئ الطبقة الفائقة من فئة فرعية.

التميز بين الأعضاء Differentiating the Members

إذا كان الفئة  يرث خصائص فئة أخرى.  وإذا كان أعضاء الطبقة الفائقة لديهم نفس أسماء الفئة الفرعية ، وللتمييز بين هذه المتغيرات ، فإننا نستخدم الكلمات الرئيسية الفائقة كما هو موضح أدناه.
super.variable
super.method();


مثال Sample Code

يوفر لك هذا القسم برنامجًا يوضح استخدام الكلمات الرئيسية الفائقة.

 في البرنامج المحدد ، لديك فئتان هما Sub_class و Super_class ، وكلاهما له طريقة تسمى display () مع تطبيقات مختلفة ، ومتغير اسمه num مع قيم مختلفة.  نحن نستحضر طريقة العرض () لكلتا الفئتين ونطبع قيمة العدد المتغير لكلتا الفئتين.  هنا يمكنك ملاحظة أننا استخدمنا كلمة رئيسية فائقة للتمييز بين أعضاء الفئة  الفائقة عن الفئة الفرعية.

 انسخ البرنامج والصقه في ملف باسم Sub_class.java.
مثال Example

class Super_class {
   int num = 20;

   // display method of superclass
   public void display() {
      System.out.println("This is the display method of superclass");
   }
}

public class Sub_class extends Super_class {
   int num = 10;

   // display method of sub class
   public void display() {
      System.out.println("This is the display method of subclass");
   }

   public void my_method() {
      // Instantiating subclass
      Sub_class sub = new Sub_class();

      // Invoking the display() method of sub class
      sub.display();

      // Invoking the display() method of superclass
      super.display();

      // printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);

      // printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);
   }

   public static void main(String args[]) {
      Sub_class obj = new Sub_class();
      obj.my_method();
   }
}

ترجمة وتنفيذ التعليمات البرمجية أعلاه باستخدام بناء الجملة التالي.
javac Super_Demo
java Super
عند تنفيذ البرنامج ، ستحصل على النتيجة التالية -
المخرجان Output
This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

استدعاء Superclass المنشئ Invoking Superclass Constructor

إذا كان الفئة  يرث خصائص فئة أخرى ، فستحصل الفئة الفرعية تلقائيًا على المُنشئ الافتراضي للفئة الفائقة او العلوية.  ولكن إذا كنت ترغب في استدعاء مُنشئ معلمات من الطبقة الفائقة او العلوية ، فأنت بحاجة إلى استخدام الكلمة الأساسية الفائقة او العلوية كما هو موضح أدناه.
super(values);

Sample Code

يوضح البرنامج الوارد في هذا القسم كيفية استخدام الكلمة الأساسية العلوية لاستدعاء مُنشئ parametrized للفئة الفائقة.  يحتوي هذا البرنامج على فئة علوية المستوى وفئة فرعية ، حيث تحتوي الفئة  العلوية على مُنشئ ذي معلمات يقبل قيمة عدد صحيح ، وقد استخدمنا الكلمة الأساسية سوبر لاستدعاء مُنشئ معلمات الطبقة العلوية.

 انسخ والصق البرنامج التالي في ملف باسم Subclass.java
مثال Example 
class Superclass {
   int age;

   Superclass(int age) {
      this.age = age;    
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String argd[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

ترجمة وتنفيذ التعليمات البرمجية أعلاه باستخدام بناء الجملة التالي.
javac Subclass
java Subclass
عند تنفيذ البرنامج ، ستحصل على النتيجة التالية -
المخرجات Output
The value of the variable named age in super class is: 24

IS-A Relationship

IS-A هي طريقة للقول: هذا الكائن هو نوع من هذا الكائن.  دعونا نرى كيف يتم استخدام كلمة التمديد لتحقيق الميراث.
public class Animal {
}

public class Mammal extends Animal {
}

public class Reptile extends Animal {
}

public class Dog extends Mammal {
}
الآن ، بناءً على المثال أعلاه ، بالمعنى المقصود بالكائنات ، فإن الأمور التالية صحيحة -

 الحيوان هو الفئة  العليا من فئة الثدييات.
 الحيوان هو الفئة  العليا من فئة الزواحف.
 الثدييات والزواحف هي فئات فرعية من فئة الحيوانات.
 الكلب هو فئة فرعية من كل من فئات الثدييات والحيوانات.
 الآن ، إذا نظرنا إلى علاقة IS-A ، يمكننا أن نقول -
  • Mammal IS-A Animal
  • Reptile IS-A Animal
  • Dog IS-A Mammal
  • Hence: Dog IS-A Animal as well
مع استخدام الكلمة الأساسية الممتدة ، ستتمكن الفئات الفرعية من وراثة جميع خصائص الفئة العلوية باستثناء الخصائص الخاصة للفئة العلوية.

 يمكننا أن نؤكد أن الثدييات هي في الواقع حيوان مع استخدام عامل التشغيل المثال.
مثال Example

class Animal {
}

class Mammal extends Animal {
}

class Reptile extends Animal {
}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

المخرجات Output
true
true
true
نظرًا لأن لدينا فهمًا جيدًا للكلمة الرئيسية الممتدة ، فلنلقِ نظرة على كيفية استخدام الكلمة الأساسية للتنفيذ للحصول على علاقة IS-A.

 بشكل عام ، يتم استخدام الكلمة الأساسية للتنفيذ مع فئات لوراثة خصائص واجهة.  لا يمكن أبدا تمديد واجهات من قبل فئة.
مثال Example
public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

الكلمة المحجوزة مثل من The instanceof Keyword

دعونا نستخدم عامل التشغيل للتحقق من ما إذا كان الثدييات بالفعل حيوانًا ، والكلب حيوانًا بالفعل.
مثال Example

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

مخرجات Output
true
true
true

HAS-A relationship

وتستند هذه العلاقات أساسا على الاستخدام.  هذا يحدد ما إذا كانت فئة معينة لديها شيء معين.  تساعد هذه العلاقة في تقليل ازدواجية التعليمات البرمجية وكذلك الأخطاء.
 لننظر إلى مثال -
مثال Example
public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 
هذا يدل على أن فئة van HAS-A السرعة.  من خلال وجود فئة  منفصل عن السرعة ، لا يتعين علينا وضع الكود بأكمله الذي ينتمي إلى السرعة داخل فئة Van ، مما يجعل من الممكن إعادة استخدام فئة السرعة في تطبيقات متعددة.

 في ميزة "كائن التوجه" ، لا يحتاج المستخدمون إلى القلق حول أي كائن يقوم بالعمل الحقيقي.  لتحقيق ذلك ، تخفي فئة Van تفاصيل التنفيذ من مستخدمي فئة Van.  لذلك ، ما يحدث أساسًا هو أن المستخدمين سيطلبون من فئة Van القيام بعمل معين ، أما فئة Van فسوف تقوم بالعمل بنفسها أو تطلب من فئة  آخر أداء الإجراء.

أنواع الوراثة Types of Inheritance

هناك أنواع مختلفة من الميراث كما هو موضح أدناه.
Types of Inheritance
هناك حقيقة مهمة يجب تذكرها وهي أن Java لا تدعم الوراثة المتعددة.  هذا يعني أن الفئة  لا يمكنه توريث  أكثر من فئة .  لذلك التالي غير قانوني -
مثالExample
public class extends Animal, Mammal{} 

ومع ذلك ، يمكن للفئة  تنفيذ واجهة واحدة أو أكثر ، مما ساعد Java على التخلص من استحالة التوريث المتعدد.

التسميات: