الفئات المجردة (Abstract Classes) في جافا
ما هي الفئات المجردة (Abstract Classes) في جافا؟
الفئة المجردة (Abstract Class) هي فئة تُستخدم لتحديد قالب (Blueprint) لفئات أخرى. الفئة المجردة يمكن أن تحتوي على دوال بدون تنفيذ (Abstract Methods) أو دوال عادية مع تنفيذ كامل. الفئات التي ترث من الفئة المجردة يجب أن توفر تنفيذًا للدوال المجردة. يتم استخدام الفئات المجردة عندما تريد إنشاء فئة تحتوي على بعض الخصائص المشتركة بين فئات متعددة، ولكنك لا تريد أن يتم إنشاء كائنات مباشرة من هذه الفئة.
الفرق بين الفئات المجردة والواجهات
رغم أن الفئات المجردة (Abstract Classes) والواجهات (Interfaces) تُستخدمان لإنشاء تصميمات قابلة للتوسعة، إلا أن هناك اختلافات رئيسية بينهما:
- **الدوال المجردة:** يمكن أن تحتوي الفئة المجردة على دوال عادية ومجردة، بينما تحتوي الواجهة على دوال بدون تنفيذ فقط (حتى الإصدار جافا 7).
- **الوراثة:** يمكن للفئة أن ترث من فئة مجردة واحدة فقط، ولكن يمكن أن تطبق عدة واجهات.
- **الخصائص (Attributes):** الفئة المجردة يمكن أن تحتوي على خصائص، بينما لا تحتوي الواجهة على خصائص (حتى الإصدار جافا 8).
كيفية إنشاء فئة مجردة في جافا
لإنشاء فئة مجردة، نستخدم الكلمة المفتاحية abstract
قبل تعريف الفئة. الصيغة العامة هي:
abstract class ClassName {
// دالة مجردة
abstract void methodName();
// دالة عادية
void normalMethod() {
// تنفيذ الدالة
}
}
مثال:
abstract class Animal {
abstract void makeSound(); // دالة مجردة لا تحتوي على تنفيذ
void breathe() { // دالة عادية تحتوي على تنفيذ
System.out.println("التنفس");
}
}
إنشاء فئات فرعية من الفئة المجردة
لتطبيق فئة مجردة، يجب على الفئة الفرعية أن ترث منها باستخدام الكلمة المفتاحية extends
، ثم تقوم بتوفير تنفيذ للدوال المجردة. الصيغة العامة هي:
class ChildClass extends AbstractClass {
// تنفيذ الدوال المجردة
void methodName() {
// الكود الخاص بالدالة
}
}
مثال:
abstract class Animal {
abstract void makeSound();
void sleep() {
System.out.println("الحيوان ينام");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("الكلب ينبح");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // استدعاء الدالة المجردة المُنفذة في فئة Dog
myDog.sleep(); // استدعاء الدالة العادية من الفئة الأب
}
}
في هذا المثال، قمنا بإنشاء فئة مجردة باسم Animal
تحتوي على دالة مجردة makeSound
ودالة عادية sleep
. الفئة Dog
ترث من Animal
وتوفر تنفيذًا للدالة makeSound
.
الكلمة المفتاحية abstract مع الدوال
يمكنك أيضًا استخدام الكلمة المفتاحية abstract
مع الدوال فقط داخل فئة مجردة. الدالة المجردة تُستخدم لتعريف قالب (Signature) الدالة بدون توفير أي تنفيذ. الفئات التي ترث من هذه الفئة يجب أن توفر تنفيذًا لهذه الدالة.
مثال:
abstract class Shape {
abstract double calculateArea(); // دالة مجردة لحساب المساحة
void display() {
System.out.println("حساب المساحة");
}
}
class Rectangle extends Shape {
double length;
double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double calculateArea() {
return length * width;
}
}
public class Main {
public static void main(String[] args) {
Rectangle myRectangle = new Rectangle(5, 10);
System.out.println("مساحة المستطيل: " + myRectangle.calculateArea());
}
}
في هذا المثال، الفئة Shape
تحتوي على دالة مجردة calculateArea
. الفئة Rectangle
ترث من Shape
وتوفر تنفيذًا للدالة calculateArea
.
متى نستخدم الفئات المجردة؟
تُستخدم الفئات المجردة عندما:
- تريد توفير قالب مشترك لمجموعة من الفئات الفرعية.
- تحتاج إلى تنفيذ بعض الدوال بشكل افتراضي في الفئة الأب، ولكن ترغب في أن تقوم الفئات الفرعية بتحديد تنفيذ بعض الدوال الأخرى.
تمرين (مستوى متوسط): إنشاء فئة مجردة لحساب المساحة
في هذا التمرين، سنقوم بإنشاء فئة مجردة تحتوي على دالة لحساب المساحة، ثم سنقوم بإنشاء فئات فرعية تمثل الأشكال الهندسية مثل المربع والمثلث والدائرة.
المتطلبات:
- إنشاء فئة مجردة باسم
Shape
تحتوي على دالة مجردةcalculateArea
. - إنشاء فئة
Square
ترث منShape
وتوفر تنفيذًا لحساب مساحة المربع. - إنشاء فئة
Circle
ترث منShape
وتوفر تنفيذًا لحساب مساحة الدائرة. - إنشاء كائن من كل فئة، واستدعاء الدالة
calculateArea
لكل كائن.
الكود:
abstract class Shape {
abstract double calculateArea();
}
class Square extends Shape {
double side;
Square(double side) {
this.side = side;
}
double calculateArea() {
return side * side;
}
}
class Circle extends Shape {
double radius;
Circle(double radius) {
this.radius = radius;
}
double calculateArea() {
return Math.PI * radius * radius;
}
}
public class Main {
public static void main(String[] args) {
Shape mySquare = new Square(4);
System.out.println("مساحة المربع: " + mySquare.calculateArea());
Shape myCircle = new Circle(3);
System.out.println("مساحة الدائرة: " + myCircle.calculateArea());
}
}
شرح الكود:
- قمنا بإنشاء فئة مجردة
Shape
تحتوي على دالة مجردةcalculateArea
. - قمنا بإنشاء فئة
Square
وفئةCircle
، كل منهما يوفر تنفيذًا لحساب المساحة. - قمنا بإنشاء كائن من كل فئة، واستدعينا الدالة
calculateArea
لطباعة المساحة.
جرّب تنفيذ هذا البرنامج بنفسك، وشارك نتيجتك معنا في التعليقات! إذا واجهتك أي مشكلة أو كان لديك سؤال، لا تتردد في طرحه.
خاتمة
في هذا الدرس، تعرفنا على الفئات المجردة في جافا، وكيفية استخدامها لتعريف قالب للفئات الفرعية. كما تناولنا الفرق بين الفئات المجردة والواجهات. نوصي بممارسة التمرين المقدم لاكتساب المزيد من الخبرة في التعامل مع الفئات المجردة. لا تنسَ ترك تعليق أو مشاركة هذا الدرس مع أصدقائك على وسائل التواصل الاجتماعي إذا وجدته مفيدًا!
اترك تعليقاً