By using this site, you agree to the Privacy Policy and Terms of Use.
موافق
عرب فلاترعرب فلاتر
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
قراءة: الدرس 49: شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)
شارك
تسجيل الدخول
إشعار أظهر المزيد
Aa
عرب فلاترعرب فلاتر
Aa
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
Search

أقسام الموقع

استكشف جميع أقسام الموقع
قسم Dart في موقع عرب فلاتر

Dart

59 مقالات
قسم Widgets في موقع عرب فلاتر

Widgets

104 مقالات
قسم Packages في موقع عرب فلاتر

Packages

19 مقالات
قسم Tutorials في موقع عرب فلاتر

Tutorials

22 مقالات

أخر المواضيع

استكشف أخر المواضيع المنشورة
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا

5
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials

حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر

10
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials

أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات

17
لديك حساب موجود؟ تسجيل الدخول
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
عرب فلاتر > Dart > الدرس 49: شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)
Dart

الدرس 49: شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)

عبدالله يوسف
أخر تحديث 2024/11/15
بواسطة عبدالله يوسف اضف تعليق 9 دقيقة للقراءة 2274 مشاهدات 4
شارك
شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)
شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)
شارك

خدماتنا البرمجية – عرب فلاتر🚀

خدماتنا البرمجية – عرب فلاتر

في عالم برمجة لغة دارت (Dart)، يعتبر مفهوم الـ Generics واحدًا من أسس البرمجة القوية والمرنة. يمثل الـ Generics مفهومًا مهمًا يسمح للمطورين بكتابة كود أكثر قابلية لإعادة الاستخدام وأكثر عمومية. في هذا المقال، سنستكشف مفهوم الـ Generics في لغة دارت، وكيفية استخدامه لإنشاء البيانات والدوال العامة التي تتعامل بشكل جيد مع مجموعات متنوعة من أنواع البيانات. سنتناول الأمثلة العملية والحالات الاستخدامية للـ Generics لنفهم كيفية الاستفادة القصوى من هذا المفهوم القوي في برمجة دارت.

المحتويات
مفهوم الـ Generics في لغة دارت:صيغة الـ Generics في لغة دارت:مثال 1: بدون استخدام الـ Genericsمثال 2: استخدام الـ Generics في دارتمتغيرات الـ Generics في لغة دارت:كلاس Map في لغة دارت:الدوال مع الـ Generics في لغة دارت:مثال 3: دالة جنريكية مع عدة معاملات:تقييد نوع البيانات في دارت:مثال 4: كلاس Generics مع تقيد البيانات:أمثلة اضافية على الـ Generics في دارت:مثال 5: استخدام الـ Generics مع الـ interfaceمثال 6: الـ Generics المتعددة في دارت

مفهوم الـ Generics في لغة دارت:

تعد الجنريكات (Generics) في لغة دارت (Dart) طريقة لإنشاء كلاس أو دالة قادرة على العمل مع أنواع مختلفة من البيانات (الكائنات). إذا نظرت إلى التنفيذ الداخلي لكلاس List، ستجد أنه كلاس جنريك. فهو يمكنه العمل مع أنواع بيانات مختلفة مثل int و String و double وغيرها. على سبيل المثال، List تمثل قائمة من الأعداد الصحيحة، وList تمثل قائمة من السلاسل النصية، وList تمثل قائمة من الأعداد العشرية.


صيغة الـ Generics في لغة دارت:

تأخذ صيغة الـ Generics شكلًا مشابهًا للكلاس العادي، باستخدام الرمز بين أقواس الزوج الزاوي لتمثيل نوع البيانات المراد استخدامه. لنلقِ نظرة على الصيغة التالية:

class ClassName<T> {
  // الكود هنا
}

مثال 1: بدون استخدام الـ Generics

فلنفترض أنك تحتاج إلى إنشاء كلاس يمكنه العمل مع كل من أنواع الأعداد الصحيحة والأعداد العشرية. يمكنك إنشاء كلاسين، أحدهما للأعداد الصحيحة والآخر للأعداد العشرية، على النحو التالي:

// بدون استخدام الـ Generic
// إنشاء كلاس للأعداد الصحيحة
class IntData {
  int data;
  IntData(this.data);
}

// إنشاء كلاس للأعداد العشرية
class DoubleData {
  double data;
  DoubleData(this.data);
}

void main() {
  // إنشاء كائن من كلاس IntData
  IntData intData = IntData(10);
  DoubleData doubleData = DoubleData(10.5);
  // طباعة البيانات
  print("IntData: ${intData.data}");
  print("DoubleData: ${doubleData.data}");
}

نتيجة الكود:

IntData: 10
DoubleData: 10.5

مثال 2: استخدام الـ Generics في دارت

في هذا المثال، سنقوم باستخدام كلاس Generic واحد يمكنه العمل مع أنواع البيانات المختلفة، بما في ذلك الأعداد الصحيحة والأعداد العشرية وأي نوع بيانات آخر.

// باستخدام الـ Generic
class Data<T> {
  T data;
  Data(this.data);
}

void main() {
  // إنشاء كائن من النوع int و double
  Data<int> intData = Data<int>(10);
  Data<double> doubleData = Data<double>(10.5);

  // طباعة البيانات
  print("IntData: ${intData.data}");
  print("DoubleData: ${doubleData.data}");
}

نتيجة الكود:

IntData: 10
DoubleData: 10.5

متغيرات الـ Generics في لغة دارت:

تُستخدم متغيرات الـ Generics لتعريف نوع البيانات التي يمكن استخدامها مع الكلاس. في المثال السابق، تم استخدام T كمتغير النوع. يمكنك استخدام أي اسم تريده لمتغير النوع، ولكن هناك بعض الأسماء الشائعة المستخدمة مثل T و E و K و V.

  • T النوع
  • E العنصر
  • K المفتاح
  • V القيمة

كلاس Map في لغة دارت:

مثل List، يعمل كلاس Map الداخلي مع أنواع بيانات مختلفة مثل int و String و double وغيرها. وذلك لأن كلاس Map هو كلاس جنريك.

// تنفيذ كلاس Map في دارت
abstract class Map<K, V> {
  // الكود هنا
  external factory Map();
}

هذا يعني ببساطة أن كلاس Map يمكنه العمل مع أنواع بيانات مختلفة.

void main() {
  final info = {
    "name": "John",
    "age": 20,
    "height": 5.5,
  }
}

الدوال مع الـ Generics في لغة دارت:

يمكنك أيضًا إنشاء دالة جنريكية. للقيام بذلك، يجب عليك استخدام الكلمة الأساسية قبل نوع البيانات المرتجع من الدالة. لنلقِ نظرة على المثال التالي:

// تعريف دالة جنريكية
T genericMethod<T>(T value) {
  return value;
}

void main() {
  // استدعاء الدالة الجنريكية
  print("Int: ${genericMethod<int>(10)}");
  print("Double: ${genericMethod<double>(10.5)}");
  print("String: ${genericMethod<String>("Hello")}");
}

نتيجة الكود:

Int: 10
Double: 10.5
String: Hello

مثال 3: دالة جنريكية مع عدة معاملات:

في هذا المثال، ستتعلم كيفية إنشاء دالة جنريكية تحتوي على عدة معاملات.

// تعريف دالة جنريكية
T genericMethod<T, U>(T value1, U value2) {
  return value1;
}

void main() {
  // استدعاء الدالة الجنريكية
  print(genericMethod<int, String>(10, "Hello"));
  print(genericMethod<String, int>("Hello", 10));
}

نتيجة الكود:

10
Hello

تقييد نوع البيانات في دارت:

يمكنك، أثناء تنفيذ الـ Generic، تقييد نوع البيانات التي يمكن استخدامها مع الكلاس أو الدالة. يتم ذلك باستخدام كلمة المفتاح extends. لنلقِ نظرة على المثال التالي:

مثال 4: كلاس Generics مع تقيد البيانات:

في هذا المثال، يوجد كلاس Data يعمل فقط مع أنواع int و double. لن يعمل مع أنواع أخرى.

class Data<T extends num> {
  T data;
  Data(this.data);
}

void main() {
  Data<int> intData = Data<int>(10);
  Data<double> doubleData = Data<double>(10.5);
  // Data<String> stringData = Data<String>("Hello"); // سيتم ظهور استثناء هنا

  print("IntData: ${intData.data}");
  print("DoubleData: ${doubleData.data}");
}

نتيجة الكود:

IntData: 10
DoubleData: 10.5

في هذا المثال، تم استخدام القيد extends num لكلاس Data. هذا يعني أنه يمكن استخدام الكلاس Data فقط مع الأنواع التي تمتد من num، وهي int و double في هذه الحالة. إذا حاولت استخدام نوع بيانات آخر مثل String، سيتم ظهور استثناء.

استخدام القيود يساعد في ضمان أن البيانات التي يتعامل معها كلاس الـ Generic تلبي متطلبات معينة، مما يزيد من سلامة البرنامج ويقلل من الأخطاء المحتملة.


أمثلة اضافية على الـ Generics في دارت:

مثال 5: استخدام الـ Generics مع الـ interface

في هذا المثال، سنستخدم الـ Generic في واجهة (interface) لتحديد نوع البيانات التي ستستخدمها الكلاسات التي تنفذها.

class Data<T> {
  T data;
  Data(this.data);
}

abstract class Printer<T> {
  void printData(Data<T> data);
}

class StringPrinter implements Printer<String> {
  void printData(Data<String> data) {
    print("String Data: ${data.data}");
  }
}

class IntPrinter implements Printer<int> {
  void printData(Data<int> data) {
    print("Int Data: ${data.data}");
  }
}

void main() {
  Data<String> stringData = Data<String>("Hello");
  Data<int> intData = Data<int>(10);

  Printer<String> stringPrinter = StringPrinter();
  stringPrinter.printData(stringData);

  Printer<int> intPrinter = IntPrinter();
  intPrinter.printData(intData);
}

نتيجة الكود:

String Data: Hello
Int Data: 10

في هذا المثال، تم استخدام الـ Generic في واجهة Printer. يتم تنفيذ الواجهة بواسطة الكلاسات StringPrinter و IntPrinter. يتم تحديد نوع البيانات الذي ستعمل معه الكلاسات المنفذة باستخدام الـ Generic.

عند استخدام الـ Printer، يتم استدعاء دالة printData في StringPrinter ويتم طباعة البيانات النصية. وعند استخدام الـ Printer، يتم استدعاء دالة printData في IntPrinter ويتم طباعة البيانات الصحيحة.

مثال 6: الـ Generics المتعددة في دارت

في هذا المثال، سنستخدم الـ Generic المتعددة في كلاس لتحقيق توافق أكثر من نوع بيانات.

class Pair<T, U> {
  T first;
  U second;

  Pair(this.first, this.second);

  void printPair() {
    print("Pair: ($first, $second)");
  }
}

void main() {
  Pair<String, int> pair1 = Pair<String, int>("Hello", 10);
  Pair<double, String> pair2 = Pair<double, String>(3.14, "World");

  pair1.printPair();
  pair2.printPair();
}

نتيجة الكود:

Pair: (Hello, 10)
Pair: (3.14, World)

في هذا المثال، تم استخدام الجنريكات المتعددة في كلاس Pair. يتم تحديد نوعي البيانات T و U عند إنشاء كائنات Pair. يتم تخزين القيمة الأولى في المتغير first من النوع T والقيمة الثانية في المتغير second من النوع U.

عند استدعاء دالة printPair، يتم طباعة القيمتين first و second بشكل مرتب في الزوج.

هكذا، يمكننا استخدام الجنريكات المتعددة لتحقيق توافق أكثر من نوع بيانات في صنف واحد، مما يزيد من مرونة البرمجة وإمثال


تعد الـ Generic في لغة دارت أداة قوية لإنشاء كلاس أو دالة قادرة على التعامل مع أنواع بيانات مختلفة. تساعد في إعادة استخدام الكود وتحقيق قابلية التوسع وزيادة الكفاءة. بفضل القيود، يمكننا تحديد النطاق الذي يمكن أن تعمل معه الـ Generic، مما يساعد في ضمان توافق البيانات وتقليل الأخطاء.

يعتبر فهم الـ Generic في دارت أساسًا هامًا لاحتراف البرمجة بهذه اللغة، حيث تستخدم في الكلاسات القياسية مثل List و Map، بالإضافة إلى القدرة على إنشاء كلاس جنريك خاص بك لتلبية احتياجاتك المحددة.

Arab Flutter Community 🚀

انضم إلى مجتمع Arab Flutter
شارك هذا المقال
فيسبوك تويتر Whatsapp Whatsapp لينكد ان تلغرام نسخ الرابط
المقال السابق شرح مفهوم الـ Factory Constructor في لغة دارت (Dart) الدرس 48: شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)
المقال التالي شرح مفهوم Null Safety في لغة دارت (Null Safety In Dart) الدرس 50: شرح مفهوم الـ Null Safety في لغة دارت (Dart)
Avatar of عبدالله يوسف
بواسطة عبدالله يوسف Founder and CEO at ArabFlutter
تابع:
أنا عبدالله يوسف، مهندس مصري ومؤسس موقع عرب فلاتر، ملهم بشغف التكنولوجيا والإبداع. كمصمم مواقع ومبرمج تطبيقات موبايل باستخدام Flutter، أستمتع بخلق عوالم رقمية فريدة ومبتكرة. تتجلى مواهبي في تصميم وتطوير واجهات مستخدم تفاعلية، حيث يمزج الجانب الجمالي بالدقة الهندسية. ما يميزني هو إلمامي الواسع بتقنيات البرمجة والتصميم، ومقدرتي على تطوير تطبيقات متنوعة عبر منصات مختلفة. أعتبر نفسي مبدعًا وملتزمًا، حيث أسعى دائمًا لتحقيق تحسين مستمر في مهاراتي وتقنياتي. أستمتع بتحديات العمل الجماعي وأؤمن بأهمية الابتكار والتطور. بفضل إبداعي والتزامي، أسعى لتقديم حلول فعّالة تلبي توقعات العملاء وتفوق عن المألوف.
اترك تعليقا اترك تعليقا

اترك تعليقاً إلغاء الرد

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials
طريقة انشاء المجلدات باستخدام Dart
طريقة انشاء المجلدات باستخدام كود Dart تلقائيًا
Tutorials

مقالات ذات الصلة

اطلع على المزيد من المقالات المتعلقة بهذا الموضوع!
شرح العوازل في لغة دارت (Isolates in Dart)
Dart

شرح العوازل في لغة دارت (Isolates in Dart)

8
شرح الـ Stream في لغة دارت (Stream in Dart)
Dart

الدرس 57: شرح الـ Stream في لغة دارت (Stream in Dart)

8
شرح عبارات async & await في لغة دارت (Dart)
Dart

الدرس 56: شرح عبارات async & await في لغة دارت (Dart)

6
شرح مفهوم الـ Future في لغة دارت (Future In Dart)
Dart

الدرس 55: شرح مفهوم الـ Future في لغة دارت (Future In Dart)

6
شرح مفهوم الـ Asynchronous في لغة دارت (Dart)
Dart

الدرس 54: شرح مفهوم الـ Asynchronous في لغة دارت (Dart)

5
10 تمارين محلولة على Null Safety في لغة دارت Dart
Dart

الدرس 53: 10 تمارين محلولة على Null Safety في لغة دارت Dart

5
أظهر المزيد
شعار موقع عرب فلاتر شعار موقع عرب فلاتر

About US

Quick Links

  • خدماتنا
  • من نحن
  • اتصل بنا
  • اتفاقية استخدام
  • سياسة الخصوصية
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
adbanner
تم اكتشاف مانع إعلانات
مرحبًا، يرجى إيقاف مانع الإعلانات. الإعلانات تُساهم في دعم موقعنا وتغطية جزء من تكاليف الاستضافة وتطوير المحتوى. شكرًا لتفهمك ودعمك.
Okay, I'll Whitelist
Welcome Back!

Sign in to your account

هل نسيت كلمة المرور؟