الدوال العامة
جزء من قسم البرمجة كائنية التوجه في رحلة 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]
}تمنحك الأساليب العامة تحكمًا دقيقًا في أمان الأنواع على مستوى الأسلوب، مما يُبقي أصنافك أبسط مع الاستفادة في الوقت نفسه من التحقق من الأنواع أثناء الترجمة.
التحدي
سهللننشئ أداة لتحويل البيانات تُبرز قوة الأساليب العامة. ستنشئ صنف 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لإنشاء قائمة يتكرر فيها73مرات، واطبع النتيجة - استخدم
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
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةالمكتبات والـ Importsمقدمة في الـ OOPالـ Classes مقابل الـ Objectsالكلمة المفتاحية thisالـ Methodsمتغيرات الـ Instanceأساسيات الـ Constructorمراجعة - آلة حاسبة بسيطة4أمان الـ Null
مقدمة في أمان الـ NullNullable مقابل Non-Nullableعاملا الـ ? و !الكلمة المفتاحية Late وأمان الـ Nullالعوامل المدركة للـ Nullأمان الـ Null في الـ Classesمراجعة - نظام ملف تعريف المستخدم7الفئات المجردة والواجهات
الفئات المجردةالدوال المجردةالواجهات في Dartالواجهات الضمنيةالتنفيذ مقابل التوسيعالواجهات المتعددةمراجعة - حاسبة الأشكال10المجموعات والأنماط العامة
نظرة عامة على List و Set و Mapالمجموعات آمنة النوعالفئات العامةالدوال العامةقيود الأنماط العامةIterable و Iteratorملخص - التخزين العام13مفاهيم OOP المتقدمة
التركيب مقابل الوراثة (Composition vs Inheritance)دوال التوسعة (Extension Methods)الأصناف القابلة للاستدعاء (Callable Classes)الأصناف المختومة (Sealed Classes - Dart 3)السجلات (Records - Dart 3)الأنماط والمطابقة (Patterns & Matching - 3.0)التعدادات مع الدوال (Enums with Methods)2المنشئات في Dart
المنشئ الافتراضيالمنشئات المسماةقوائم التهيئةالمنشئات الثابتةالمنشئات المصنعيةالمنشئات الموجهةملخص - بناء الأشكال5التغليف (Encapsulation)
الأعضاء العامة مقابل الخاصةاتفاقية البادئة _الخصوصية على مستوى المكتبةتعمق في Getters و Settersإخفاء المعلوماتمراجعة - سجلات الطلاب8Mixins
مقدمة إلى Mixinsإنشاء Mixinsاستخدام Mixins متعددةالكلمة المفتاحية on في MixinsMixin مقابل الوراثة (Inheritance)Mixin مقابل الواجهة (Interface)مراجعة - نظام الحيوانات (Animal System)3خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticحقول Final و Constمتغيرات Lateالـ Static Methods والحقولدوال الـ Getters والـ Settersمراجعة - مدير الحساب البنكي6الوراثة
أساسيات الوراثةالكلمة المفتاحية superإعادة تعريف الدوال (Method Overriding)الوسم @overrideالكلمة المفتاحية final Classالدوال البانية والوراثةمراجعة - هيكلية الموظفين9تعدد الأشكال
أساسيات تعدد الأشكالتعدد الأشكال عبر الـ Interfacesالتحقق من النوع أثناء التشغيلالمعاملات is و asالكلمة المفتاحية Covariantملخص - معالج الدفع12البرمجة الكائنية غير المتزامنة (Async OOP)
Futures و async/awaitأساسيات الـ Streamsمتحكمات الـ Streamsالـ Constructors غير المتزامنةالعمليات غير المتزامنة في دوال الكلاسمراجعة - جالب البيانات (Data Fetcher)15أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودعتدرّب بنفسك: مترجم Dart عبر الإنترنت