CodeGym /مدونة جافا /Random-AR /الميراث في جاوة
John Squirrels
مستوى
San Francisco

الميراث في جاوة

نشرت في المجموعة
Java هي لغة موجهة للكائنات. هذا يعني أن كل شيء في Java يتكون من الفئات وكائناتها، ويخضع لنماذج OOP (البرمجة الشيئية). أحد هذه النماذج هو الوراثة، وهي آلية في Java يتم من خلالها السماح لفئة واحدة بوراثة الميزات (الحقول والأساليب) لفئة أخرى. ببساطة، في لغة Java، الوراثة تعني إنشاء فئات جديدة بناءً على الفئات الموجودة. الميراث في جاوة - 1

الجهات الفاعلة الرئيسية في الميراث في جاوة

  • الميراث هو مفهوم أن الفصل يمكن أن يكرر جزئيًا أو كليًا خصائص وطرق والده (الفئة التي يرث منها).
  • الفئة الفرعية، أو الفئة الفرعية، أو الفئة الموسعة، أو الفئة المشتقة هي فئة ترث من فئة أخرى.
  • الفئة الأصلية أو الفئة الفائقة أو الفئة الأساسية هي فئة تحتوي على عدد من الوظائف، ويمكن تمرير هذه الوظائف (توريثها) بواسطة فئة أخرى (فئة فرعية).
  • يؤدي تجاوز الطريقة إلى تغيير سلوك طريقة الفئة المشتقة. عادةً ما يكون هذا سلوكًا أكثر تحديدًا ودقة. إذا قمت بتجاوز طريقة في الوريث موجودة بالفعل في الفئة الأصلية، فإنها تحل محل الطريقة الأصلية نوعًا ما.
  • يمكن أن تحتوي الفئة على فئة أسلاف واحدة فقط، ولكن يمكن أن تحتوي كل فئة على العديد من "الأبناء".

كيف تعمل

يتم توجيه سلسلة الميراث من الطبقة الأكثر تجريدًا إلى الطبقة الأكثر واقعية. أي أن الطبقة المتفوقة هي الأكثر تجريدًا في سلسلة الطبقات. غالبًا ما يُشار إليها على أنها مجردة (الفئة الأساسية التي لا تتطلب التنفيذ). جميع الفئات الأخرى أكثر تحديدًا. على سبيل المثال، هناك فئة تسمى "الأداة". يمكن أن تحتوي على سعة بطارية حقلية (أو حالة) "وزن"، ومستوى شحن المجال وطرق (أو سلوك) "العمل" والشحن. في هذه الحالة، يمكن أن تكون الأساليب مجردة، أي أنها لا تحتوي على تطبيق محدد. على الرغم من أننا لا نستطيع تحديد نوع هذه الأداة، إلا أنها بالتأكيد أي أداة قابلة لإعادة الشحن. لنقم بإنشاء فئة فرعية للهاتف من فئة الأداة. ولم يعد بحاجة إلى إعادة تعريف الوزن والبطارية، بل يرثهما ببساطة من الأداة المجردة. لكن سلوك العمل سوف يحتاج إلى توضيح. يمكنك أيضًا إضافة حقول أخرى مثل "قطر الشاشة" والموصلات وما إلى ذلك. يمكنك إضافة طريقة جديدة "تحديث نظام التشغيل". بعد ذلك، يمكننا إنشاء فئتين إضافيتين وسيتم توريثهما من الهاتف وAndroid وiPhone. ترث كلا الفئتين جميع مجالات وأساليب الأداة والهاتف الذكي، ويمكن تجاوز الأساليب. الفئة الأولى تحتاج إلى حقل "اسم العلامة التجارية"، بينما الآيفون لا يحتاج إلى هذا الحقل، حيث أن شركة واحدة فقط هي التي تنتج مثل هذه الهواتف الذكية.
class Gadget {}
}
//subclass of Gadget class
class Phone extends Gadget {}
//subclass of Phone class
class IPhone extends Phone {}
//subclass of Phone class
class AndroidPhone extends Phone {}
ترث الفئة التابعة جميع الأعضاء العامين والمحميين في الفئة الأصلية. لا يهم الحزمة التي توجد بها الفئة الفرعية. إذا كانت الفئة الفرعية موجودة في نفس الحزمة مثل الفئة الأصلية، فإنها ترث أيضًا أعضاء الحزمة الخاصة للأصل. يمكنك استخدام الأعضاء الموروثة كما هي، أو استبدالها، أو إخفائها، أو إضافة أعضاء جدد:
  • يمكنك استخدام الحقول الموروثة مباشرة مثل أي حقول أخرى.
  • يمكنك الإعلان عن حقل في الفصل الفرعي له نفس الاسم الموجود في الفصل الأصلي. إنه يخفيه (لذا من الأفضل عدم القيام بذلك).
  • يمكنك الإعلان عن حقول جديدة في الفصل الفرعي (تلك الحقول التي لا تتوفر في الفصل الأصلي).
  • يمكن استخدام الأساليب الموروثة مباشرة دون تجاوز الفئة المشتقة.
  • يمكنك أيضًا كتابة طريقة مثيل جديدة في فئة فرعية لها نفس التوقيع كطريقة في الفئة الأصلية. هذا الإجراء يتجاوز ذلك.
  • يمكنك الإعلان عن أساليب جديدة في الفصل الفرعي لم يتم الإعلان عنها في الفصل الأصل.
  • يمكنك كتابة مُنشئ فئة فرعية يستدعي مُنشئ الفئة الفائقة إما ضمنيًا أو باستخدام الكلمة الأساسية super.

مثال

لنقم بإنشاء فئة MusicalInstrument أساسية تحتوي على حقول الوزن والعلامة التجارية، بالإضافة إلى طريقة العمل () . نحدد أيضًا المنشئ.
public class MusicalInstrument {
   int weight;
   String tradeMark;

   public MusicalInstrument(int weight, String tradeMark) {
       this.weight = weight;
       this.tradeMark = tradeMark;
   }

   public void work() {
       System.out.println("the instrument is playing...");
   }
}
ليس من الواضح تمامًا نوع الآلة الموسيقية وكيفية العزف عليها. دعونا نصنع أداة أكثر تحديدًا، الكمان. سيكون لها نفس الحقول الموجودة في الآلة الموسيقية (سيتم استدعاؤها في المُنشئ باستخدام الكلمة الأساسية super. يمكننا أيضًا تجاوز طريقة العمل وإنشاء طريقة لضبط سلسلة الكمان بسلسلة.
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

   @Override
   public void work() {
       System.out.println("THe violin's playing");

   }

   public void violinTuning () {
     System.out.println("I'm tuning 1st string...");
     System.out.println("I'm tuning 2nd string...");
     System.out.println("I'm tuning 3rd string...");
     System.out.println("I'm tuning 4th string...");
}


}
لنقم بإنشاء فصل تجريبي لاختبار فصل الكمان ومعرفة كيفية عمل الميراث بالضبط.
public class InheritDemo {

   public static void main(String[] args) {

       Violin violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       violin.violinTuning();
       violin.work();
   }
}
وفي هذه الحالة ستكون مخرجات البرنامج كما يلي:
أضبط الوتر الأول... أضبط الوتر الثاني... أضبط الوتر الثالث... أضبط الوتر الرابع... عزف الكمان
أي أنه إذا كانت هناك طريقة متجاوزة في الفصل الفرعي، فلن يتم استدعاء الطريقة السلف بعد الآن. ماذا لو لم يكن هناك؟ أي أن فئة الكمان تبدو كما يلي:
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

  // @Override


 //  }

   public void violinTuning () {
       System.out.println("I'm tuning 1st string...");
       System.out.println("I'm tuning 2nd string...");
       System.out.println("I'm tuning 3rd string...");
       System.out.println("I'm tuning 4th string...");
   }

}
الإخراج هو:
أقوم بضبط الوتر الأول... أقوم بضبط الوتر الثاني... أقوم بضبط الوتر الثالث... أقوم بضبط الوتر الرابع... الآلة تعزف...
أي أنه سيتم استدعاء طريقة السلف تلقائيًا. بالمناسبة، يمكن تعريف الفئة الفرعية من خلال السلف، أي إجراء عملية الترقية:
Parent parent = new Child()
يتم استخدام هذه التهيئة للوصول فقط إلى الأعضاء الموجودين في الفئة الأصلية والطرق التي تم تجاوزها. في مثالنا سيكون:
public class InheritDemo {

   public static void main(String[] args) {

       MusicalInstrument violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       //violin.violinTuning();
       violin.work();
   }
}
في مثل هذه الحالة، نحن لسنا قادرين على تكوين طريقة الكمان. ولكن في الوقت نفسه، سيتم استدعاء طريقة العمل () للفئة التابعة، إذا كانت موجودة.

التسلسل الهرمي لفئة منصة Java

في Java، كل شيء يتكون من فئات وهي تابعة للتسلسل الهرمي. السؤال الذي يطرح نفسه: هل هناك فئة يرث منها كل الآخرين؟ الجواب هو نعم، بالفعل مثل هذه الفئة موجودة. ويسمى ببساطة Object . تحدد فئة الكائن من حزمة java.lang وتنفذ السلوك الشائع لجميع الفئات، بما في ذلك تلك التي تقوم بإنشائها. في منصة Java، يتم اشتقاق العديد من الفئات مباشرة من Object ، بينما تشتق فئات أخرى من بعض هذه الفئات، وهكذا، لتشكل تسلسلًا هرميًا للفئات.

أنواع الميراث في جاوة

دعونا نسلط الضوء على بعض أنواع الميراث في جافا. 1. الوراثة الفردية هذا النوع يشبه تمامًا مثالنا أعلاه، حيث ترث الفئات الفرعية ميزات فئة فائقة واحدة. في الصورة أدناه، تعمل الفئة A كفئة أساسية للفئة المشتقة B. 2. الوراثة متعددة المستويات هذه مجرد سلسلة وراثة، أي أن هناك فئة أساسية A، يتم توريث الفئة B منها، والفئة C موروث من الفئة B. في Java، لا يمكن للفئة الوصول مباشرة إلى أعضاء الأجداد. 3. الوراثة الهرمية في الوراثة الهرمية، تعمل فئة واحدة كفئة فائقة (فئة أساسية) لأكثر من فئة فرعية واحدة. أعلاه، قدمنا ​​مثالاً لفئة الهاتف، والتي يمكن أن تحتوي على "طفلين" - AndroidPhone وIPhone.
class A {
    public void printA() {
System.out.println("A");
 }
}

class B extends A {
    public void printB() {
 System.out.println(" B"); }
}

class C extends A {
    public void printC() {
System.out.println("C");
}
}

class D extends A {
    public void printD() {
System.out.println("D");
 }
}

public class Demo {
    public static void main(String[] args)
    {
        B objB = new B();
        objB.printA();
        objB.printB();

        C objC = new C();
        objC.printA();
        objC.printC();

        D objD = new D();
        objD.printA();
        objD.printD();
    }
}
الإخراج هو:
أ ب أ ج أ د
4. الميراث المتعدد، أي وجود العديد من الأسلاف ... ولكن مهلا، الميراث المتعدد الكلاسيكي غير مدعوم في Java. إلى حد ما، يمكن تنفيذه ليس باستخدام الفئات، ولكن الواجهات.
interface A {
   public void printA();
}

interface B {
   public void printB();
}

interface C extends A, B {
   public void print();
}
class InheritDemo implements C {
   @Override
   public void print()
   {
       System.out.println("Print something");
   }

   @Override
   public void printA() {
   }

   @Override
   public void printB() {
   }
}
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION