• 0
bashmohandes

مقدمة في ال Generics

سؤال

هذا درس بسيط في ال Generics باستخدام ال VB.net الاصدار 2005

مبدئيا محترفي ال ++C يفهمون الConcept الخاص بالGenerics لانه مقتبس بالكامل من ال Templates في ال ++C.

ثانيا لشرح المفهوم بطريقة سريعة تابع الكود التالي على سبيل المثال

Dim myList as New ArrayList()
myList.Add(4535)
myList.Add(18989)
myList.Add(3455)

في الكود السابق ستجد ان ال myList استخدمت و كأنها Array of Integers و لكن المشكلة الاساسية ان الCompiler لن يرفض جملة مثل هذه

myList.Add("String Data")

و هذا لان الArrayList تقبل اي متغير من اي نوع و تقوم بعمل Boxing له في نوع Object.

و لهذا فعند استعادة القيم من ال ArrayList فاننا نقوم بعمل Type Conversion

Dim myIntVar as Integer = CInt(myList.Item(0))

و لكن مشكلة اخرى ان الCompiler لن يعترض على هذه الجملة

بفرض وجود Class من اختراعنا اسمها BusinessObject

Dim myObject as BusinessObject = CType(myList.Item(0), BusinessObject)

بفرض ان القيمة الاولى في الList كانت اساسا من نوع Integer و ليس من نوع BusinessObject و لكن الCompiler لن يعترض و لكن سيحدث InvalidCastException في اثناء الRuntime و قد تقضي ساعات في محاولة اصلاح الخطأ

كل هذه المشكلات نشأت من ان الArrayList تقبل اي نوع و هكذا فقدنا ميزة الType Safe.

تابع معي هذا الكود

Dim MyNewList as New List(Of Integer)
MyNewList.Add(1020)
MyNewList.Add(3040)

ستجد في الكود السابق اننا استخدمنا الGenerics في انشاء List من نوع معين اي انها لن تقبل اي متغيرات او قيم من اي نوع اخر اي اننا اذا كتبنا هذا السطر

MyNewList.Add("String Data")

سيعترض الCompiler بشدة على هذه الجملة بسبب ان MyNewList لا تقبل Strings

أيضا يمكنك استخدام القيم من الList مباشرة على انها Integer بدون الحاجة لعمل Cast

كما ان استخدام الGenerics غير مقصور على الabstract types مثل ال integer و الstring و الfloat و .... الخ بل انه يمتد الى اي نوع اخر من الtypes اي اننا يمكننا ان نبني List من نوع BusinessObject

Dim MyBusinessList as New List(of BusinessObject)

ارجو ان يكون المفهوم الاساسي قد وصل الى الاذهان

المرحلة التالية هي بناء اول Generic خاصة بنا

تابع الكود التالي

Public Class MyGeneric(Of T)
Dim X as T;

Public Property MyX() as T
Set(ByVal Value as T)
Me.X = Value
End Set
Get
Return Me.X
End Get
End Property
End Class

اعتقد ان الكود يشرح نفسه و لكن سأحاول تفسيره

عند استخدام هذا الكود هكذا

Dim MyObject as New MyGeneric(of Integer) ()

بعد تنفيذ هذا السطر سيتم انشاء object من نوع MyGeneric و ستصبح قيمة T هي Integer و بالتالي سيصبح المتغير الداخلي X من نوع Integer

أيضا يمكنك ان تجعل الGeneric تأخذ اكثر من Type مثل

public class MyGen(of  T1,  T2)

ارجو ان تعم الفائدة على الجميع.

الدرس القادم Generic Methods

تم تعديل بواسطه bashmohandes
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

8 إجابة على هذا السؤال .

  • 0

السلام عليكم

بارك الله فيك يا باشمهندس وفى انتظار باقى الدروس

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يعطيك العافية .. ياريت إرفاق أمثلة تكون من خلال الواقع حتى تصبح الفكرة أكثر وضوحا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الدرس جميل جدا، لكن هذه عجيبة؟؟!!!!

Public Function DoSomething() as T
return New T();
End Function

إذ كيف يرجع لك كائنا جديدا من T??? على فرض أن T كانت (بضاعة) تأخذ سعرا ونوعا واسما كمتغيرات:

Item item= new Item("Bag", 10,);

هذا شيء جديد علي!!

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

العملية صحيحة و ليس فيها اي مشاكل في الكود

و لكن المثال لمجرد تقريب الفكرة و ليس بهدف كتابة برنامج يقوم بوظيفة معينة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل لك أن تجرب لي هذه الشفرة:

class Item {
String name;
Item(String name){
this.name=name;
}
}

public class SomeList<T>{
public SomeList(){}
public T getItem(){
return new T();
}
}

public class TestGeneric{
public static void Main(){
SomeList<Item> list=new SomeList<Item>();
Item item=list.getItem();
Console.Write(item);
}
}

ما هي مخرجات البرنامج؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا على مراجعة الكود و جزاك الله خيرا

بالفعل هناك خطأ

تم تصحيح الكود

تم تعديل بواسطه bashmohandes
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وجزاك الله خيرا... وبارك فيك..

أرجوأن تتابع الدروس...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .