JavaRush /مدونة جافا /Random-AR /مثيل وأساسيات الميراث

مثيل وأساسيات الميراث

نشرت في المجموعة
مرحبًا! في المحاضرات السابقة، واجهنا لفترة وجيزة مفهوم الميراث عدة مرات. واليوم سنتطرق أيضًا إلى هذا الموضوع، ولكن أيضًا ليس بعمق شديد. ستكون هناك محاضرة مفصلة حول هذا الأمر لاحقًا، لكننا اليوم سننظر فقط إلى الأمثلة العملية ونتعرف على أحد المشغلين المثيرين للاهتمام في Java.

جافا الميراث

إذن ما هو الميراث بالضبط؟ أساسيات المثيل والميراث - 1الوراثة هي آلية في البرمجة، بما في ذلك Java، تسمح لك بوصف فئة جديدة بناءً على فئة موجودة. ثم تتمكن الفئة التابعة من الوصول إلى حقول وأساليب الفئة الأصلية. لماذا قد يكون هذا ضروريا؟ حسنًا، على سبيل المثال، تخيل أنك بحاجة إلى إنشاء عدة فئات من السيارات في البرنامج: شاحنة، سباق، سيدان، بيك اب، إلخ. حتى بدون البدء في كتابة التعليمات البرمجية، فأنت تعلم على وجه اليقين أن هذه الفئات لديها الكثير من القواسم المشتركة: جميع السيارات لها اسم الطراز، وسنة الصنع، وحجم المحرك، والسرعة القصوى، وما إلى ذلك. (ناهيك عن حقيقة أن جميعها بها عجلات وأجزاء أخرى). في مثل هذه الحالة، يمكنك:
  • أنشئ هذه الحقول في كل فئة وأضفها إلى فئات السيارات الجديدة عند إنشائها
  • انقل الحقول المشتركة بين كافة الأجهزة إلى الفئة الأصلية Car، وسترث كافة فئات الأنواع المحددة من الأجهزة من Carاستخدام الكلمة Extends .
الخيار الثاني، بالطبع، هو أكثر ملاءمة:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
على الأقل، تجنبنا التكرار غير الضروري للتعليمات البرمجية، وهذا شيء يجب أن نسعى دائمًا لتحقيقه عند كتابة البرامج. بالإضافة إلى ذلك، لدينا بنية فئة بسيطة ومفهومة: يتم وضع الحقول المشتركة لجميع الأجهزة في فئة واحدة. على سبيل المثال، إذا كانت الشاحنات تحتوي على بعض الحقول المحددة التي لا تمتلكها السيارات الأخرى، فيمكن الإعلان عنها في ملف Truck. الشيء نفسه ينطبق على الأساليب. جميع السيارات لديها بعض السلوكيات المشتركة التي يمكن وصفها: تشغيل السيارة، الغاز/الفرامل، وما إلى ذلك. يمكن وضع هذه الأساليب العامة في فئة عامة Car، ويمكن وصف السلوك المحدد لكل نوع محدد في الفئات التابعة.
public class Car {

   public void gas() {
       //...gas
   }

   public void brake() {
       //...brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
لقد قمنا بنقل الأساليب الشائعة لجميع السيارات إلى الفصل Car. ولكن في الفئة اللاحقة F1Carالتي تصف سيارات سباق الفورمولا 1 - محطات التوقف (توقف للصيانة العاجلة للسيارة)، والتي تتم فقط في السباق وتتميز بسلوك محدد.

مثيل جافا للمشغل

للتحقق مما إذا كان قد تم إنشاء كائن بناءً على فئة ما، يوجد عامل تشغيل خاص في Java - instanceof. تقوم بإرجاع القيمة trueإذا كان الاختبار صحيحًا، أو falseإذا كانت النتيجة خاطئة. دعونا نرى كيف يعمل باستخدام فئات السيارات لدينا كمثال:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
الإخراج: صحيحinstanceof تم إرجاع الشيك باستخدام عامل التشغيل true، نظرًا لأن لدينا كائنًا من الفئة Truck، وجميع الشاحنات عبارة عن سيارات. الفئة Truckهي سليل الفئة Car، لذلك، يتم إنشاء جميع الشاحنات على أساس أصل مشترك - السيارة. انتبه إلى عامل التشغيل instanceof: إنه مكتوب بدون نقطة، لأنه عامل وليس طريقة ("مثيل كائن للفئة"). دعونا نحاول ذلك بشكل مختلف:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
الإخراج: false الفئة Car، وبالتالي، كائنها لا يشتق من الفئة Truck. جميع الشاحنات هي سيارات، ولكن ليست كل السيارات هي شاحنات. لا يتم إنشاء الكائنات Carبناءً على الفئة Truck. مثال آخر:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
الإخراج: صحيح المنطق هنا بسيط أيضًا: جميع الفئات في Java، بما في ذلك تلك التي قمت بإنشائها، تأتي من فئة Object(على الرغم من أنك لا تكتب كائنًا ممتدًا فيها - فهذه الآلية مضمنة فيها). لماذا قد يكون هذا مفيدًا وتحت أي ظروف؟ الاستخدام الأكثر شيوعًا للمشغل instanceofهو تجاوز الأسلوب equals(). على سبيل المثال، إليك كيفية تنفيذ الطريقة equalsفي الفصل String:
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
قبل مقارنة السلسلة بالكائن الذي تم تمريره، تتحقق الطريقة من: هل الكائن الذي تم تمريره عبارة عن سلسلة بالفعل؟ وعندها فقط يبدأ بمقارنة خصائص جسمين. بدون هذا التحقق، يمكنك تمرير أي كائن يحتوي على حقول قيمة وطول إلى الطريقة ومقارنته بسلسلة، وهو ما سيكون خطأ بالطبع.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION