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

الفئات العامة

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

لقد رأيت كيف تستخدم المجموعات المضمّنة في Dart، مثل List<String>، معلمات النوع. حان الوقت الآن لإنشاء فئات generic خاصة بك تعمل مع أي نوع تحدده.

يستخدم الصنف generic معلَمة نوع (عادةً T) كعنصر نائب للنوع الفعلي الذي سيتم توفيره عند إنشاء مثيل:

class Box<T> {
  T content;
  
  Box(this.content);
  
  T getContent() => content;
}

void main() {
  var stringBox = Box<String>('Hello');
  var intBox = Box<int>(42);
  
  print(stringBox.getContent());  // Hello
  print(intBox.getContent());     // 42
}

يعمل T كمتغير نوع — عند إنشاء Box<String>، يصبح كل T في الفئة String. وهذا يمنحك أمان الأنواع دون كتابة فئات منفصلة لكل نوع.

يمكنك استخدام معاملات نوع متعددة عندما تحتاج فئتك إلى العمل مع أكثر من نوع واحد:

class Pair<K, V> {
  K first;
  V second;
  
  Pair(this.first, this.second);
}

void main() {
  var pair = Pair<String, int>('age', 25);
  print('${pair.first}: ${pair.second}');  // age: 25
}

تُعد الفئات generic أساسًا للشفرة القابلة لإعادة الاستخدام والآمنة من ناحية الأنواع. وبدلًا من تكرار المنطق لأنواع مختلفة أو فقدان معلومات النوع باستخدام dynamic، تتيح لك الأنواع العامة كتابة شفرة مرنة يمكن للمصرّف التحقق منها أيضًا.

challenge icon

التحدي

سهل

لنُنشئ نظامًا لتغليف الهدايا يستخدم الأصناف generic لإنشاء حاويات مرنة لأنواع مختلفة من العناصر. ستنشئ صنف Wrapper عامًا يمكنه تغليف أي نوع من content، وصنف GiftBox بمعاملَي نوع لربط هدية برسالة بطاقة.

ستنظّم الشيفرة في ملفين:

  • wrapper.dart: Define أصنافك العامة هنا:
    • صنف عام Wrapper<T> مع خاصية T content وبانٍ. أضف أسلوبًا unwrap() الذي returns المحتوى، وأسلوبًا describe() يطبع Wrapped: [content]
    • صنف عام GiftBox<G, C> مع خاصيتين: G gift وC card. أضف بانياً وأسلوبًا open() يطبع Gift: [gift] في سطر واحد وCard: [card] في السطر التالي
  • main.dart: استورد ملف Wrapper الخاص بك ووضّح الأصناف العامة باستخدام أنواع مختلفة:
    • Create Wrapper<String> يحتوي على 'Chocolate' واستدعِ describe()
    • Create Wrapper<int> يحتوي على 42 واستدعِ describe()
    • Create Wrapper<double> يحتوي على 3.14 واستدعِ describe()
    • اطبع سطرًا فارغًا
    • Create GiftBox<String, String> مع الهدية 'Teddy Bear' والبطاقة 'Happy Birthday!'، ثم استدعِ open()
    • اطبع سطرًا فارغًا
    • Create GiftBox<int, String> مع الهدية 100 (يمثل قيمة بطاقة هدية) والبطاقة 'Congratulations!'، ثم استدعِ open()

لاحظ كيف يعمل الصنف Wrapper نفسه بسلاسة مع السلاسل النصية والأعداد الصحيحة والأعداد العشرية. يوضّح الصنف GiftBox استخدام معاملَي نوع لربط نوعين مختلفين معًا - يمكن أن تكون الهدية من أي نوع، بينما تظل رسالة البطاقة سلسلة نصية.

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

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

جرّب بنفسك

import 'wrapper.dart';

void main() {
  // TODO: أنشئ Wrapper<String> يحتوي على 'Chocolate' واستدعِ describe()
  
  // TODO: أنشئ Wrapper<int> يحتوي على 42 واستدعِ describe()
  
  // TODO: أنشئ Wrapper<double> يحتوي على 3.14 واستدعِ describe()
  
  // TODO: اطبع سطرًا فارغًا
  
  // TODO: Create a GiftBox<String, String> with gift 'Teddy Bear' 
  // and card 'Happy Birthday!', then call open()
  
  // TODO: اطبع سطرًا فارغًا
  
  // TODO: أنشئ GiftBox<int, String> مع هدية 100 
  // and card 'Congratulations!', then call open()
}
quiz iconاختبر نفسك

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

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

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