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

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

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

ميراث

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

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() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
أضفنا الأساليب المشتركة لجميع السيارات إلى الفصل Car. لكن انظر إلى F1Carالفصل الذي يمثل سيارات السباق "الفورمولا 1". يتم إجراء التوقفات (التوقفات للصيانة العاجلة للسيارة) فقط في السباقات، لذلك أضفنا هذه الوظيفة المحددة إلى الفئة المشتقة ذات الصلة. الحالة والميراث 101 - 2

مثيل المشغل

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

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
الإخراج: trueinstanceof يُرجع عامل التشغيل true ، نظرًا لأن لدينا Truckكائنًا، وجميع الشاحنات عبارة عن سيارات. الطبقة Truckمشتقة من Carالطبقة. يتم إنشاء جميع الشاحنات بناءً على الأصل المشترك، وهو Carالفصل. انظر عن كثب إلى كيفية instanceofاستخدام المشغل. تكتبه بدون نقطة، لأنه عامل وليس طريقة ("مثيل كائن للفئة"). فلنجرب طريقة أخرى:

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
الإخراج: خطأ الفئة 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;
}
قبل مقارنة a Stringبالكائن الذي تم تمريره، تختبر الطريقة لمعرفة ما إذا كان الكائن عبارة عن سلسلة؟ عندها فقط يبدأ بمقارنة خصائص الكائنين. إذا لم يكن هذا الاختبار موجودًا، فمن الممكن تمرير أي كائن له حقول قيمة وطول إلى الطريقة ومقارنته بسلسلة، وهو ما سيكون خطأ بالطبع .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION