Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأصناف القابلة للاستدعاء (Callable Classes)

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 84 من 110.

في لغة Dart، يمكنك جعل مثيلات الفئة (class) قابلة للاستدعاء مثل الدوال عن طريق تنفيذ التابع call(). يتيح لك ذلك استخدام كائن بصيغة استدعاء الدوال - أي استخدام الأقواس مباشرة على المثيل.

class Multiplier {
  final int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  var triple = Multiplier(3);
  
  print(double(5));   // 10 - استدعاء الكائن كدالة
  print(triple(5));   // 15
}

عندما تكتب double(5)، يقوم Dart تلقائياً باستدعاء الطريقة call() مع 5 كمعامل. يتصرف الكائن كدالة مع الاستمرار في الحفاظ على حالته (الحقل factor).

يمكن للطريقة call() أن تمتلك أي توقيع - معاملات متعددة، معاملات اختيارية، أو حتى إرجاع أنواع مختلفة:

class Greeter {
  final String greeting;
  
  Greeter(this.greeting);
  
  String call(String name, {String punctuation = '!'}) {
    return '$greeting, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));              // مرحباً، أليس!
  print(hello('Bob', punctuation: '.')); // مرحباً، بوب.
}

تعد الفئات القابلة للاستدعاء (Callable classes) مفيدة عندما تحتاج إلى سلوك يشبه الدوال مقترنًا بالحالة أو التكوين. وهي تُستخدم بشكل شائع لإنشاء عمليات قابلة لإعادة الاستخدام، أو أدوات تحقق، أو تحويلات تحتاج إلى تذكر الإعدادات بين الاستدعاءات.

challenge icon

التحدي

سهل

لنقم ببناء نظام لتنسيق النصوص باستخدام الأصناف القابلة للاستدعاء (callable classes)! ستقوم بإنشاء كائنات يمكن استدعاؤها مثل الدوال لتحويل النصوص بطرق مختلفة، مع الحفاظ على إعدادات التكوين الخاصة بها.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • formatters.dart: قم بإنشاء صنفين قابلين للاستدعاء يقومان بتحويل النص:
    • صنف Wrapper يغلف النص ببادئة (prefix) ولاحقة (suffix). يجب أن يخزن String prefix و String suffix، وعند استدعائه مع بارامتر String text، يعيد النص مغلفاً بين البادئة واللاحقة.
    • صنف Repeater يكرر النص عدداً معيناً من المرات. يجب أن يخزن قيمة int times، وعند استدعائه مع بارامتر String text، يعيد النص مكرراً ذلك العدد من المرات مع وجود مسافة بين كل تكرار.
  • main.dart: استورد المنسقات الخاصة بك ووضح كيف تعمل الأصناف القابلة للاستدعاء:
    • أنشئ Wrapper ببادئة "[" ولاحقة "]"
    • أنشئ Wrapper آخر ببادئة "***" ولاحقة "***"
    • أنشئ Repeater يكرر 3 مرات
    • استدعِ المغلِف (wrapper) الأول مع "Hello" واطبع النتيجة
    • استدعِ المغلِف الثاني مع "Important" واطبع النتيجة
    • استدعِ المكرر (repeater) مع "Go" واطبع النتيجة
    • أخيراً، ادمجهما معاً: استدعِ المغلِف الأول مع نتيجة استدعاء المكرر مع "Dart"، واطبع النتيجة

لاحظ كيف يتذكر كل كائن منسق إعداداته ويمكن استدعاؤه مباشرة باستخدام الأقواس، تماماً مثل الدالة!

المخرجات المتوقعة:

[Hello]
***Important***
Go Go Go
[Dart Dart Dart]

ورقة مرجعية

يمكن جعل الأصناف (Classes) قابلة للاستدعاء مثل الدوال من خلال تنفيذ التابع call():

class Multiplier {
  final int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  print(double(5));   // 10 - استدعاء الكائن مثل الدالة
}

يمكن أن يمتلك التابع call() أي توقيع (signature) مع معلمات متعددة، أو معلمات اختيارية، أو أنواع إرجاع مختلفة:

class Greeter {
  final String greeting;
  
  Greeter(this.greeting);
  
  String call(String name, {String punctuation = '!'}) {
    return '$greeting, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));              // Hello, Alice!
  print(hello('Bob', punctuation: '.')); // Hello, Bob.
}

الأصناف القابلة للاستدعاء مفيدة لإنشاء سلوك يشبه الدوال مدمج مع حالة (state) أو إعدادات (configuration).

جرّب بنفسك

import 'formatters.dart';

void main() {
  // TODO: "[" واللاحقة "]" البادئة Wrapper قم بإنشاء
  
  // TODO: "***" واللاحقة "***" البادئة Wrapper قم بإنشاء آخر
  
  // TODO: يكرر 3 مرات Repeater قم بإنشاء
  
  // TODO: مع "Hello" واطبع النتيجة Wrapper قم باستدعاء أول
  
  // TODO: مع "Important" واطبع النتيجة Wrapper قم باستدعاء ثاني
  
  // TODO: مع "Go" واطبع النتيجة repeater قم باستدعاء الـ
  
  // TODO: مع نتيجة استدعاء Wrapper ادمجهم: قم باستدعاء أول
  // مع "Dart"، واطبع النتيجة repeater الـ
  
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming