اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

التجريد هو من مفاهيم ال OOP الأساسية وهو ببساطة عملية إخفاء بعض التفاصيل وإظهار المعلومات الأساسية فقط للمستخدم

ويمكننا تنفيذ مفهوم التجريد من خلال

  •  abstract classes
  • .interfaces

لاحظ المثال التالي

abstract class Animal {
  public abstract void animalSound();
  public void sleep() {
    System.out.println("Zzz");
  }
}

ال abstract class لا يمكننا إنشاء كائنات منه إنما الوراثة منه فقط

وال abstract method لاتحتوي على body 

أما بالنسبة interfaces فهي تقوم أيضاً بالتجريد ولكن ببعض الإختلافات عن ال abstract class

كما أن بالإضافة للتنفيذ التجريد بواسطة interface يمكنك أيضاً تنفيذ الوراثة المتعددة من خلالها

  • 0
نشر

مفهوم التجريد: تعني Abstraction في اللغة الإنجليزية, و هو أسلوب مهم جداً من أساليب البرمجة الغرضية التوجه OOP و يستخدم لتسهيل كتابة الأوامر على المبرمجين, فهو يجعلك قادراً على تنفيذ ما تريد دون الحاجة إلى معرفة كافة التفاصيل التي تم فيها تنفيذ ذلك. إذاً الـ Abstraction يجعلك تتعامل مع الأشياء بسطحية بدل أن تغوص في معرفة تفاصيل الكودات المعقدة. لتطبيق مفهوم الـ Abstraction نستخدم الكلمة abstract ضمن شروط محددة.

  • الكلاس المعرف كـ abstract يسمى Abstract Class.
  • الكلاس العادي الغير معرف كـ abstract يسمى Concrete Class.
  • الدالة المعرفة كـ abstract تسمى Abstract Method أو Abstract Function.

نقاط مهمة حول الـ Abstract Class:

  • الكلاس العادي لا يمكنه أن يحتوي على دوال نوعها abstract.

  • الـ Abstract Class يمكنه أن يحتوي على دوال عادية, و يمكنه أن يحتوي على دوال نوعها abstract.

  • إذا قمت بتعريف الكلاس كـ abstract, فهذا يعني أن هذا الكلاس لا يمكن إنشاء كائنات منه.

  • بما أنه لا يمكن إنشاء كائنات من Abstract Class, فهذا يعني أنه للإستفادة من هذا الكلاس, يجب وراثته.

  • الكلاس الذي يرث من كلاس نوعه abstract, يجب أن يفعل Override لجميع الدوال المعرفة كـ abstract.

مثال لتعريف abstract class:

abstract class Shape {

}

نقاط مهمة حول الـ Abstract Method:

  • إذا وضعت الكلمة abstract قبل إسم الدالة, فهذا يعني أنها دالة من النوع abstract.
  • الدالة التي نوعها abstract هي دالة لها إسم و نوع محدد, لكنها لا تحتوي على body (جسم), أي لا تملك أقواس بداية و نهاية { }.
  • الدالة العادية تحتوي على أقواس البداية و النهاية { }.
  • الـ Abstract Method يجب وضع فاصلة منقوطة ; في آخرها بدل أقواس البداية و النهاية.
  • الكلاس الذي يرث من كلاس نوعه abstract, يجب أن يقوم بإعادة تعريف (Override) لجميع الدوال التي نوعها abstract, أي يجب أن يكتب الـ body لهذه الدوال.

مثال عن abstract method:

public abstract void calculateArea();

يُمكنك الإطلاع على هذا المقال للإطلاع على المزيد:

مفهوم الواجهات (interfaces) في جافا:

في جافا لا يُمكن لكلاس ما أن يرث من أكثر من كلاس أي أن الوراثة المتعددة غير متاحة بعكس اللغات مثل ++c لذلك قام مطورو اللغة بإنشاء مفهوم الinterface و يُستخدم المفهوم كوسيط لتطوير البرامج و يُساعد كثيرا في عملية توسيع البرنامج و جعله قابلاً للتطوير بكل سهولة و لتجهيز أسلوب يُمكن السير عليه و إتباعه في ربط الكلاسات. و تساعد الواجهات كثيراً و تخدم أسلوب التعددية الشكلية polymorphism.

طريقة التعامل مع الواجهات تُشبه كثيراً طريقة التعامل مع الكلاسات المجردة

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

interface MyInterface {
  
}

و لتوسعة كلاس من خلال واجهة نستخدم الكلمة المحجوزة implements:

class A implements MyInterface {
  
}

شروط أساسية لإنشاء و التعامل مع الواجهات:

  • لا نستخدم أي Access Modifer عند تعريف الواجهة.
  • لا نستخدم أي Access Modifer عند تعريف دالة بداخل الواجهة.
  • بداخل الواجهة جميع الدوال يجب أن لا تملك body, و يمكن جعل الدالة ترمي إستثناء.
  • لا يمكن للواجهة أن تملك دالة بانية
  • لا يمكن إنشاء كائن من واجهة.
  • لا يستطيع الكلاس أن يرث (extends) من واجهة بل يُمكنه تنفيذ (implements) واجهة أو أكثر
  • الكلاس الذي يُنفذ واجهة ما عليه إعادة تعريف جميع دوال تلك الواجهة.
  • يُمكن لواجهة أن ترث (extends) من واجهة أو أكثر.

للحصول على معلومات أكثر يُمكنك الإطلاع على المقال التالي:

 

  • 1
نشر
  • التجريد Abstract:
    هناك حالات نحتاج فيها أن نعرف صف يمثل فكرة مجردة بدون تعريف كامل لطرائق هذا الصف، مثلاً قد يطلب منا تعريف صفوف تمثل مركبات متعددة مثل سيارات أو طائرات أو شاحنات أو دراجات نارية. في هذه الحالة يكون الحل الأمثل هو تعريف صف يمثل فكرة مجردة وهذه الفكرة هنا هي "المركبة" فكل المركبات تشترك بأنها تتحرك ولكن حركة الطائرة تختلف عن حركة القطار مثلاً. إذاً نقوم بتعريف الصف المجرد الذي يمثل المركبة ونعرف ضمنه طريقة مجردة تعبر عن حركة المركبة، وبعدها نستطيع وراثة مركبات متعددة من هذا الصف، فمثلاً يمكننا وراثة صف يمثل قارب ونقوم بتعريف طريقة الحركة فيه على أنها حركة في الماء ونستطيع تعريف صف يمثل طائرة تكون طريقة الحركة فيه هي الحركة في السماء وهكذا..
    نعرف الصف المجرد بالشكل:
    abstract class class_name{...}
    كما يجب أن تعلم أن الصفوف المجردة يمكن أن تحوي داخلها طرائق مجردة ويمكن أن لاتحوي أي طريقة مجردة، حيث أننا نقوم عن طريقة ما أنها طريقة مجردة إذا كانت بدون جسم (أي بدون كتلة تحقيق) أي لاتملك أي تعريف Implementation:
    abstract public void function();
    #abstract لاحظ أنها بلا جسم+نضع بدايتها الكلمة 
    أيضاً يجب أن تعلم أنه في حال كان الصف يحوي طريقة مجردة فيتوجب أن يكون هذا الصف مجرد أيضاً. والصف المجرد لايمكن أخذ كائنات منه، حيث يمكننا فقط وراثته، وعند وراثته يجب أن نقوم بتحقيق كل الطرق الموجودة فيه Implementation.
    abstract class vehicle{
    	abstract void motion();
    }
    # نقوم بوراثته
    class car extends vehicle{
    	void motion(){
    		System.out.print("The car uses wheels to walk on the roads");
    	}
    }
    # 
    class plane extends vehicle{
    	void motion(){
    		System.out.print("fly in the sky");
    	}
    }
    وأخيراً، يمكننا أن نعرف ضمن الصف المجرد باني لكن كما نعلم أن الباني لايمكن وراثته وإنما يمكننا فقط استدعاؤه من خلال الصفوف الأبناء. كما أنه لايمكن أن يكون الباني مجرداً لأنه بالأصل لاتتم وراثته. أيضاً يتوجب على الصف الذي يرث الصف المجرد (مثلاً car) أن يحقق كل الطرق المجردة في الصف المجرد (vehicle) وإلا سيكون هو مجرد أيضاً (صف مجرد يرث صف مجرد).
  • الواجهات Interfaces :
    هي بنية شبيهة بالصف وشبيها جداً بال Astract Class. ويمكن أن تحتوي على ثوابت وطرق مجردة فقط. يمكن تشبيه الواجهة بصف مجرد كل طرقه مجردة. ولتعريفها:
    interface Interface_name{
     ...
    }

    لايمكننا أخذ كائن من الواجهة، وإنما يتم تحقيق طرائقها من خلال صف يقوم بتحقيقها من خلال الكلمة المحجوزة implements عوضاً عن الكلمة extends التي تعبر عن الوراثة. (الانترفيس يتم تحيقها وليس وراثتها).

    interface Face{...}
    class A imlements Face{...}

    الآن الصف A يحقق الواجهة Face وبالتالي يجب أن نعرف كل طرائق الواجهة Face في الصف A. كما يمكن للصف أن يحقق أكثر من واجهة.

    interface i1 { }
    interface i2 { }
    class A implements i1, i2 { }

    يستطيع الإنترفيس أن يرث من إنترفيس أو أكثر. أي يستطيع الإنترفيس أن يفعل extends لإنترفيس أو أكثر.

    interface i1 { }
    interface i2 { }
    interface i3 extends i1, i2 { }

    يمكن للصف أن يرث صف ويحقق واجهة أو أكثر:

    interface i { }
    class A { }
    class B extends A implements i { }

    Nested Interfaces:

    interface i1 {                      
        interface i2 {                 
            interface i3 {              
            }
        }
    }
    class A implements i1 { }       //i1 يحقق الواجهة  A الكلاس     
    class B implements i1.i2 { }     //i2 هنا يحقق الواجهة    
    class C implements i1.i2.i3 { }  // i3

    يمكن أن تحتوي الواجهة على مايلي: دوال لا تملك body, أي Abstract Method. متغيرات مع إعطائهم قيمة بشكل مباشرةً عند تعريفهم. لأن أي متغير تقوم بتعرفه بداخل الإنترفيس يعتبر معرف كـ public final static بشكل تلقائي. Nested Classes, أي كلاس نوعه static بداخل كلاس نوعه static كما يمكن أن يحوي على Nested Interfaces  أي إنترفيس بداخل إنترفيس. والإنترفيس يعتبر دوماً public.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...