English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، سنتعلم التجريد في Java. سنتعلم الفئات التجريدية والطرق في Java وكيفية استخدامها في البرامج.
الفئة التجريدية هي فئة لا يمكن إنشاؤها (لا يمكننا إنشاء مثال على الفئة التجريدية). في Java، نستخدم كلمة المفتاح abstract لتعريف فئة تجريدية.
abstract class Animal { //خصائص والطرق }
إذا حاولت إنشاء مثال على فئة抽象ة، سيظهر خطأ في التجميع. على سبيل المثال،
Animal a1 = new Animal()
سيظهر خطأ في التجميع:
الحيوان هو مجرد مفهوم؛ لا يمكن إنشاء مثاله
على الرغم من أننا لا يمكننا إنشاء كائن من الفئة التجريدية، ولكن يمكننا إنشاء فرع من الفئة التجريدية. يمكننا إنشاء كائن من الفرع لاستدعاء أعضاء الفئة التجريدية.
قبل أن نعرف عنها بشكل دقيق، نحتاج إلى فهم طريقة التجريد.
نستخدم نفس الكلمة المفتاحية abstract لإنشاء طريقة تجريدية. تم إعلان طريقة تجريدية دون تنفيذها. على سبيل المثال،
abstract void makeSound();
في هذا السياق، makeSound() هي طريقة تجريدية.
من المهم أن نلاحظ أن يمكن أن تحتوي فئة واحدة فقط على طرق تجريدية. إذا أضفنا طريقة تجريدية إلى فئة ليست تجريدية، فإن هذا سيؤدي إلى خطأ.يمكن للفئة التجريدية أن تحتوي على طرق تجريدية وطرق غير تجريدية. هذا مثال.
abstract class Animal { public void displayInfo() { System.out.println("أنا حيوان."); } abstract void makeSound(); }
في المثال السابق، قمنا بإنشاء فئة تجريدية Animal. تحتوي هذه الفئة على طريقة تجريدية makeSound() وطرق غير تجريدية displayInfo().
لا يمكن لتجريد الفئة أن يتم إنشاؤها. لاستدعاء أعضاء الفئة التجريدية، يجب أن نرثها. على سبيل المثال
abstract class Animal { public void displayInfo() { System.out.println("أنا حيوان."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
الإخراج:
أنا حيوان.
في المثال السابق، قمنا بإنشاء فئة تجريدية Animal. لا يمكننا إنشاء كائن من فئة Animal. لاستدعاء طريقة displayInfo() من فئة Animal، نرث فرع Dog من Animal.
ثم، نستخدم كائن d1 من Dog لاستدعاء الطريقة displayInfo().
في Java، يجب على الفرع إعادة كتابة الطريقة التجريدية للفئة الأصلية. هذا بسبب أن الفرع ورث الطريقة التجريدية من الفئة الأصلية.
بسبب أن فرعنا يحتوي على طريقة تجريدية، نحتاج إلى إعادة كتابتها.
ملاحظة:إذا تم إعلان الفرع أيضًا كتجريدي، فلا يجب عليك إعادة كتابة الطريقة التجريدية.
abstract class Animal { abstract void makeSound(); public void eat() { System.out.println("أستطيع أكل."); } } class Dog extends Animal { public void makeSound() { System.out.println("بورك بورك"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); d1.eat(); } }
الإخراج:
بورك بورك. أستطيع أكل.
في المثال السابق، قمنا بإنشاء فئة تجريدية Animal. تحتوي هذه الفئة على طريقة تجريدية makeSound() وطرق غير تجريدية eat().
نحن نرث فئة Dog من فئة Animal. هنا، يغطي فرع Dog الطريقة التجريدية displayInfo().
ثم قمنا بإنشاء كائن Dog d1. باستخدام هذا الكائن، نحن نستدعي طرق d1.displayInfo() و d1.eat().
مثل الفئات غير المحددة، نستخدم كلمة المفتاح super للوصول إلى بناء محرك السيارة للفئة الفرعية من الفئة الفرعية. على سبيل المثال،
abstract class Animal { Animal() { ... } } class Dog extends Animal { Dog() { super(); ... } }
في هذا، نستخدم super() في بناء محرك السيارة الفرعية Dog للوصول إلى بناء محرك السيارة للفئة Animal.
ملاحظة، يجب أن يكون super دائمًا الخطوة الأولى في بناء محرك السيارة الفرعية. الوصولكلمات المفتاح Javaللحصول على معلومات إضافية.
التعبير هو مفهوم مهم في البرمجة الموجهة للأجراء. يظهر التعبير فقط المعلومات المطلوبة، وتبقى جميع التفاصيل غير الضرورية مخفية. هذا يسمح لنا بادارة التعقيد من خلال تجنب أو تخفيض التفاصيل باستخدام أفكار بسيطة وأكثر تطورًا.
مثال واقعي للتعبير يمكن أن يكون نظام الفرامل في الدراجة النارية. نعرف وظيفة الفرامل. عندما نضغط على الفرامل، تتوقف الدراجة النارية. ولكن عمل الفرامل يبقى لنا مخفيًا.
من المزايا الرئيسية لتغطية مبدأ العمل في نظام الفرامل، أن الآن يمكن للمصنعين استخدام فرامل مختلفة للدراجات النارية المختلفة، ولكن وظيفة الفرامل هي نفسها.
لنأخذ مثالاً لنجعل فهمنا أفضل عن التعبير عن Java.
abstract class Animal { abstract void makeSound(); } class Dog extends Animal { public void makeSound() { System.out.println("Bark bark."); } } class Cat extends Animal { public void makeSound() { System.out.println("Meows "); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); Cat c1 = new Cat(); c1.makeSound(); } }
الإخراج:
Bark bark Meows
في المثال السابق، قمنا بإنشاء سلسلة فرعية Animal. تحتوي سلسلة الفروع Animal على طريقة تعريفية makeSound().
قانون makeSound() غير قادر على تنفيذ داخل Animal. لأن كل حيوان ينفذ صوتًا مختلفًا. لذلك، لدى كل فرع من فروع Animal طريقة تنفيذ مختلفة لـ makeSound().
لا يمكننا تنفيذ makeSound() في Animal بطريقة تعمل بشكل صحيح مع جميع فرعات Animal. لذلك، يبقى تنفيذ makeSound() في Animal في حالة سرية.
في المثال السابق، Dog قام بإنشاء تنفيذ الخاص به لـ makeSound()، وCat قام بإنشاء تنفيذ الخاص به لـ makeSound().
نستخدم كلمة المفتاح abstract لإنشاء الفئة التجريبية والطريقة التجريبية.
لا تحتوي الطريقة التجريبية على أي تنفيذ (جسم الطريقة).
الفئة التي تحتوي على طرق تجريبية يجب أن تكون تجريبية.
لا يمكننا إنشاء موضوع للفئة التجريبية.
لتحقيق الوظائف للفئة التجريبية، نتعاقب مع الفرعية التي تنحدر منها ونقوم بإنشاء موضوع للفرعية.
يجب على الفرعية أن تعيد كتابة جميع الطرق التجريبية للفئة التجريبية. ولكن إذا تم إعلان الفرعية كتجريبية، فإنه لا يتعين عليها إعادة كتابة الطرق التجريبية.
يمكننا استخدام مرجع الفئة التجريبية لتحليل الخصائص والطرق التجريبية. على سبيل المثال،
Animal.staticMethod();
في Java، الواجهة تشبه الفئة التجريبية ولكن الواجهة لا تحتوي على أي طرق غير تجريبية. في الدرس التالي، سنتعلم المزيد عن الواجهات.