/Java Programming : Let's Master 9/ii

Java Programming : Let's Master 9/ii

النهاردة معادنا عشان نكمل شابتر 9 في سلسلة تعلم الجافا وهنتكلم عن مجموعة مفاهيم ومصطلحات مهمة جدا في الجافا وتخص الـ OOP ومنها:

9.4. Overriding Methods

احنا اتفقنا اننا نقدر ننادي علي اي ميثود موجودة في الكلاس الأب واحنا جوه الكلاس الإبن ونستخدمها عادي بس ساعات بنبقي محتاجين نعدل كمان فيها مش ننادينا بنفس ال، implemtation وده مايسمي بـ method overriding .

احنا كنا عملنا ميثود toString في كلاس GeometricObject وكانت مهمتها انها تطبع مواصفات الشكل المطلوب واحنا نقدر نعدلها بحيث انها تطبع بس نصف القطر بالنسبة للدايرة بالطريقة دي:

public class Circle extends GeometricObject {
  // Other methods are omitted

  /** Override the toString method defined in GeometricObject */
  public String toString() {
    return super.toString() + "\nradius is " + radius;
  }
}

ودلوقتي عندنا اتنين ميثود بنفس الشكل ولكن محتواهم مختلف وكلاس Circle هو الوحيد اللي يقدر يستخدمهم مع بعض ولما نيجي ننادي الميثود الخاصة بالكلاس الأب بنستخدم كلمة super .

يعني لو عملنا أوبجكت من circle وخليناه ينده على ميثو toString() هينده عليها من كلاس Circle وفي حالة اننا عايزين ننده عليها من الكلاس الأب هنستخدم كلمة super .. وطبعا الميثود بقى ليها implementation مختلف ما بين وجودها في الكلاس الأب أو في الكلاس الابن.

9.5. Overriding vs. Overloading

في الفوكس دي هنعمل مقارنة بين الOverriding وال Overloading

احنا قبل كده في شابتر 5 واحنا بنتكلم عن الميثودس قولنا ان فيه حاجة اسمها method overloading بمعني اننا نقدر نعمل اكتر من ميثود بنفس الأسم ولكن بنديهم متغيرات مختلفة وممكن يرجعوا انواع مختلفة برده , ولكن لو عاوزين نعمل method overriding بنعمل اكتر من ميثود بنفس الأسم وبنفس انواع المتغيرات ونفس نوع النتيجة اللي هترجع منها (لو هترجع حاجة) ولكن المحتوي اللي بداخلهم هو اللي مختلف فقط وده المثال بيوضح الفرق بينهم :

9.6. The Object Class and Its toString() Method

 الفوكس دي في الكتاب بتتكلم عن ميثود مهمة جدا في الجافا API وهي ميثودtoString()

  احنا في الأول قولنا ان كل الكلاسات اللي استخدمناهم او عملناهم قبل كده كلهم بيـ extends من كلاس java.lang.Object واللي بيحصل انه في حالة عدم تحديد كلاس انه يكون super للكلاس الحالي بيتم جعل كلاس Object ده هو الsuperclass زي المثال ده مثلا الكلاسين دول تمام زي بعض مفيش اي فرق بينهم :

وبيدينا مثال علي الميثودس الموجودة في الكلاس ده وهي ميثود toString() وشكلها:

public String toString()

هنا الميثود هترجع الـ string اللي بيمثل اي object وبالتحديد بترجع اسم الكلاس اللي الـ object ده جزء منه وبعدين علامة (@) وبعدين الـ hash code الخاص بالـ object ده بالـ hexadecimal زي كده :

Loan loan = new Loan();
System.out.println(loan.toString());

الناتج هيبقي حاجة زي كده Loan@15037e5 .

Polymorphism, Dynamic Binding, and Generic Programming

مبدأ التوريث او الـ inheritance بيمكن الـ subclass من انه ياخد جميع صفات الـ superclass وكمان بيحتوي علي صفات زيادة عن الكلاس الأب يعني نقدر نقول ان الكلاس الإبن هو حالة خاصة من الكلاس الأب . نراعي ان كل subclass جزء من الـ superclass

علي سبيل المثال نقدر نقول ان كل دايرة عبارة عن شكل ولكن مش نقدر نقول ان كل شكل هو دايرة .وبكده نعرف اننا نقدر نستخدم صفات الـ superclass بداخل الـ subclass وليس العكس زي كده:

package chapter9;

  public class PolymorphismDemo {
    public static void main(String[] args) {
    m(new GraduateStudent());
    m(new Student());
    m(new Person());
    m(new Object());
    }

    public static void m(Object x) {
      System.out.println(x.toString());

  }

  class GraduateStudent extends Student {
  }

  class Student extends Person {
    public String toString() {
      return "Student";
    }
  }

  class Person extends Object {
    public String toString() {
      return "Person";
    }
  }

والناتج هيبقي شكله كده

في الأول هملنا ميثود بتاخد متغير من نوع Object والسبب في كده اني اقدر اديها اي object زي (new Student()) وطبقنا المبدأ بتاعنا في كلاس GraduateStudent هو صحيح مش فيه اي ميثود ولكن هو بيـ extends من كلاس Student وعلشان كده نفذنا اللي جوه الكلاس الأب بتاعه.

المثال اللي فات يعتبر تطبيق علي مايعرف بالـ dynamic binding وزي ماقولنا فكرته هي عبارة عن عمل ميثود مثلا في مكان وإعادة استخدامها في اكتر من مكان بأكتر من شكل .

علشان نقدر نفهم الجزئية دي اكتر هنفترض ان عندنا object اسمه o وبيـ extends من كلاسات, CnC1, C2, …, Cn-1وكل كلاس منهم بيـ extends من اللي بعده هنلاقي ان عندنا كل الكلاسات بيـ extends من كلاس Cnيعني هو زي كلاس Object عندنا واللي بيحصل لما نبننادي علي ميثود عن طريق o ان الـ compiler بيبحث عن اول وجود للميثود دي في الكلاسات الكتير دول ولما بيلاقيه بيستخدمه زي ماحصل في البرنامج اللي فات.

لحد هنا نكون خلصنا النهاردا.. وأتمنى يكون مفهوم الDynamic binding بقا واضح عند الناس.. ولو فيه أي استفسار انا معاكم دايما برحب بأي أسئلة..

I'm Omar Ezz Ed-Dien, Software Engineer - Java developer. #Java is such a way of thinking :-)