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

دالة call()

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

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

class Multiplier {
  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.call(5)، يمكنك ببساطة كتابة double(5). تقوم Dart تلقائياً باستدعاء التابع call() عندما تستخدم الأقواس على الكائن.

يمكن للتابع call() قبول أي معاملات وإرجاع أي نوع، تماماً مثل التابع العادي:

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

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

هذا النمط مفيد عندما تحتاج إلى كائنات تتصرف مثل الدوال ولكنها تحافظ أيضاً على الحالة أو التكوين. يُستخدم بشكل شائع لإنشاء عمليات أو أدوات تحقق أو منسقات قابلة لإعادة الاستخدام والتي تحتاج إلى تذكر الإعدادات بين الاستدعاءات.

challenge icon

التحدي

سهل

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

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

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

لاحظ كيف يمكنك استدعاء كائنات التنسيق الخاصة بك مباشرة باستخدام الأقواس، تماماً مثل الدوال العادية. طريقة call() تجعل هذا ممكناً، وكل كائن يتذكر تكوينه بين الاستخدامات!

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

[Hello]
***Important***
Go Go Go
***[Nested]***

ورقة مرجعية

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

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

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

بدلاً من كتابة double.call(5)، يمكنك ببساطة كتابة double(5). يقوم Dart تلقائياً باستدعاء طريقة call() عند استخدام الأقواس على الكائن.

يمكن لطريقة call() قبول أي معاملات وإرجاع أي نوع:

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

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

هذا النمط مفيد لإنشاء كائنات تتصرف مثل الدوال ولكنها تحافظ أيضاً على الحالة أو الإعدادات بين الاستدعاءات.

جرّب بنفسك

import 'formatters.dart';

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

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

جميع دروس Object Oriented Programming