Menu
CoddyTech

الدوال العامة

جزء من قسم البرمجة كائنية التوجه في رحلة Dart على Coddy. الدرس 66 من 110.

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

تُعلن الطريقة العامة عن معامل النوع قبل نوع القيمة المُعادة:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // hello
}

غالبًا ما يستطيع Dart استنتاج النوع من الوسائط، لذا ليس عليك دائمًا تحديده صراحةً:

var result = findFirst([10, 20, 30]);  // تستنتج Dart النوع int

تكون الأساليب العامة مفيدة بشكل خاص داخل الأصناف عندما تحتاج عمليات معينة فقط إلى مرونة في الأنواع:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // النوع مستنتج على أنه int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

تمنحك الأساليب العامة تحكمًا دقيقًا في أمان الأنواع على مستوى الأسلوب، مما يُبقي أصنافك أبسط مع الاستفادة في الوقت نفسه من التحقق من الأنواع أثناء الترجمة.

challenge icon

التحدي

سهل

لننشئ أداة لتحويل البيانات تُبرز قوة الأساليب العامة. ستنشئ صنف Transformer بأساليب يمكنها العمل مع أي نوع، مما يمنحك المرونة دون جعل الصنف بأكمله عامًا.

ستنظم شيفرتك في ملفين:

  • transformer.dart: أنشئ صنف Transformer بهذه الأساليب العامة:
    • T getFirst<T>(List<T> items) - يعيد العنصر الأول من قائمة
    • T getLast<T>(List<T> items) - يعيد العنصر الأخير من قائمة
    • List<T> repeat<T>(T item, int times) - ينشئ قائمة تحتوي على العنصر مكررًا العدد المحدد من المرات
    • void printPair<A, B>(A first, B second) - يطبع قيمتين بالتنسيق Pair: [first] and [second]
  • main.dart: استورد ملف أداة التحويل واعرض كل أسلوب عام باستخدام أنواع مختلفة:
    • أنشئ نسخة من Transformer
    • استخدم getFirst مع [10, 20, 30] واطبع النتيجة
    • استخدم getFirst مع ['apple', 'banana', 'cherry'] واطبع النتيجة
    • استخدم getLast مع [1.5, 2.5, 3.5] واطبع النتيجة
    • استخدم repeat لإنشاء قائمة تتكرر فيها 'Hi' 4 مرات، واطبع النتيجة
    • استخدم repeat لإنشاء قائمة يتكرر فيها 7 3 مرات، واطبع النتيجة
    • استخدم printPair مع 'Name' و42
    • استخدم printPair مع 100 وtrue

لاحظ كيف يعلن كل أسلوب عن معامل النوع الخاص به أو معاملاته، مما يتيح لكائن Transformer نفسه العمل مع الأعداد الصحيحة والسلاسل النصية والأعداد العشرية والقيم المنطقية، مع ضمان سلامة الأنواع بالكامل. يوضح الأسلوب printPair كيفية استخدام معاملي نوع في أسلوب واحد.

الناتج المتوقع:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

جرّب بنفسك

import 'transformer.dart';

void main() {
  // أنشئ نسخة من Transformer
  var transformer = Transformer();

  // TODO: استخدم getFirst على [10, 20, 30] واطبع النتيجة

  // TODO: استخدم getFirst على ['apple', 'banana', 'cherry'] واطبع النتيجة

  // TODO: استخدم getLast على [1.5, 2.5, 3.5] واطبع النتيجة

  // TODO: استخدم repeat لإنشاء قائمة تحتوي على 'Hi' مكررة 4 مرات واطبعها

  // TODO: استخدم repeat لإنشاء قائمة تحتوي على 7 مكررًا 3 مرات واطبعها

  // TODO: استخدم printPair مع 'Name' و42

  // TODO: استخدم printPair مع 100 وtrue
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Dart عبر الإنترنت