منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : The Generics
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : !!! BoriS !!!

السلام عليكم ورحمة الله وبركاتة

ال Generic


البرمجة هى عملية ايجاد حلول للمشاكــــل ، فى أغلب الاحيان حل مشكلة معينة بطريقة معينة تكون حل لكثير من المشاكل المشتركة.

على سبيل المثال :

الحاجة الى تجميع وفرز قائمة من البنود كــا Items هى مشكلة مشتركة داخل برامجك ونحتاجها فى اغلب الاحيان والاماكن ، داخل ال .NET Frame Work توجد الفئة Arraylist التى تستطيع حل هده المشكلة ببساطة بسبب أن الفئة Arraylist لاتعلم نوع الكائن الدى تريد حفظة ، ببساطة تقوم بحفظها ككائنات من النوع Object لان كل شئ داخل ال .Net يستطيع ان يظهر على هيئة Object بناء على دلك ال Array List تستطيع حفظ اى نوع لاى Object وبدلك تكون قد حلت المشكلة.

أيضا ال Objects Collections تستطيع حل هدة المشكلة فهى تقدم شئ جديد على سبيل المثال : ان أردت حفظ مجموعة من انواع المتغيرات من النوع Integers تستطيع كتابة سطرين من الكود كالاتى :


كود :
[color=#000000][COLOR=#0000bb]Dim myInts [/color][color=#007700]as new [/color][color=#0000bb]Arraylist[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])

For [/COLOR][color=#0000bb]Each I [/color][color=#007700]as [/color][COLOR=#0000bb]Object In myInts
    Dim number [/COLOR][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][color=#0000bb]CType[/color][color=#007700]([/color][color=#0000bb]I[/color][color=#007700],[/color][color=#0000bb]Integer[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]Next  
[/COLOR][/COLOR]


كود :
[color=#000000][COLOR=#0000bb]ArrayList myInts [/color][color=#007700]= New [/color][color=#0000bb]ArrayList[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700]);

foreach ([/COLOR][color=#0000bb]Object I In myInts[/color][COLOR=#007700])
{
    [/COLOR][color=#0000bb]Int number [/color][color=#007700]= (int)[/color][color=#0000bb]I[/color][COLOR=#007700];
}  
[/COLOR][/COLOR]

يمكنك الان من انشاء Collection وأضافة ال Integers السابقة إليه ، تستطيع إيجاد القيم السابقة خارج ال Collection من خلال عمل Cast لهم من خلال النوع Object والتى تعود به ال Collection الخاصة بك ولكن ماالعمل عند أضافة الاتــى :


كود :
[color=#000000][COLOR=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#dd0000]"5"[/color][COLOR=#007700])  
[/COLOR][/COLOR]


كود :
[color=#000000][COLOR=#0000bb]myInts[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#dd0000]"5"[/color][COLOR=#007700]);  
[/COLOR][/COLOR]

سيتم تجميع بدون مشاكل لكن داخل حلقة ForEach سوف يظهر امام عيتيك Exception بسبب ان "5" قيمة نصية وليس Integer اليك الحل :


كود :
[color=#000000][COLOR=#007700]Public Class [/color][COLOR=#0000bb]IntList
    [/COLOR][color=#007700]Implements [/color][COLOR=#0000bb]ICollection
    [/COLOR][color=#007700]Implements [/color][COLOR=#0000bb]IEnumerable

[/COLOR][color=#007700]Private [/color][color=#0000bb]_innerList [/color][color=#007700]As [/color][color=#0000bb]ArrayList [/color][color=#007700]= New [/color][color=#0000bb]ArrayList [/color][COLOR=#007700]()

Private [/COLOR][color=#0000bb]Sub Add[/color][color=#007700]([/color][color=#0000bb]Byval number [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
[/COLOR][color=#0000bb]_innerList[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]number[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub

[/COLOR][color=#007700]Default Public [/color][color=#0000bb]ReadOnly Property Item [/color][color=#007700]([/color][color=#0000bb]Index [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
    Get
        [/COLOR][color=#007700]Return [/color][color=#0000bb]CType[/color][color=#007700]([/color][color=#0000bb]_innerList[/color][color=#007700]([/color][color=#0000bb]Index[/color][color=#007700]),[/color][color=#0000bb]Integer[/color][COLOR=#007700])
    [/COLOR][COLOR=#0000bb]End Get
End Property  
[/COLOR][/COLOR]


كود :
[color=#000000][COLOR=#007700]Public class [/color][color=#0000bb]IntList [/color][color=#007700]: [/color][color=#0000bb]ICollection[/color][color=#007700], [/color][COLOR=#0000bb]IEnumerable  
[/COLOR][COLOR=#007700]{
Private [/COLOR][color=#0000bb]ArrayList _innerList [/color][color=#007700]= new [/color][color=#0000bb]ArrayList[/color][COLOR=#007700]();

Public [/COLOR][color=#0000bb]void Add[/color][color=#007700]([/color][color=#0000bb]int number[/color][COLOR=#007700])
{
    [/COLOR][color=#0000bb]_innerList[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]number[/color][COLOR=#007700]);
}
Public [/COLOR][color=#0000bb]int this[/color][color=#007700][[/color][color=#0000bb]int Index[/color][COLOR=#007700]]
{
    [/COLOR][COLOR=#0000bb]Get
    [/COLOR][COLOR=#007700]{
        Return (int)[/COLOR][color=#0000bb]_innerList[/color][color=#007700][[/color][color=#0000bb]Index[/color][COLOR=#007700]];
    }
}  
[/COLOR][/COLOR]

الخلاصة ، قم بأنشاء Collection جديد يتضمن الواجهــة ICollection and IEnumerable ، أستخدم ArrayList لكى يتم تجميع البنود Items ، أخيرا قم بعمل Add لقيمك كالاتـــى :

كود :
[color=#000000][COLOR=#0000bb]Dim myIntegers [/color][color=#007700]As New [/color][color=#0000bb]IntList[/color][COLOR=#007700]()

[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])

For [/COLOR][color=#0000bb]Each I [/color][color=#007700]As [/color][COLOR=#0000bb]Object In myIntegers
    Dim number [/COLOR][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][color=#0000bb]CType[/color][color=#007700]([/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]Integer[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]Next  
[/COLOR][/COLOR]


كود :
[color=#000000][COLOR=#0000bb]IntList myIntegers [/color][color=#007700]= New [/color][color=#0000bb]IntList[/color][COLOR=#007700]();

[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]muIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]myIntegers[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])

foreach ([/COLOR][color=#0000bb]Object I in myIntegers[/color][COLOR=#007700])
{
    [/COLOR][color=#0000bb]Int number [/color][color=#007700]= (int) [/color][color=#0000bb]I[/color][COLOR=#007700];
}  
[/COLOR][/COLOR]

ستتم عملية الترجمة بدون ادنى مشاكل الا عند محاولة اضافة قيم غير عددية Integers

هدا الحل صحيح ولكنة يتطلب وقت طويل ادا تاكدت ان القيم المررة عددية

ال Generics هى انواع تاخد اسماء انواع اخرى لكى تقوم بتعريفهم ب Type ، بدلا من أنشاء Collection يسمح بتمرير نوع محدد من البيانات سوف نقوم بعمل Generic Collection يستطيع استقبال اى نوع


كود :
[color=#000000][COLOR=#007700]Public Class [/color][color=#0000bb]MyList[/color][color=#007700]([/color][color=#0000bb]Of T[/color][COLOR=#007700])
    Implements [/COLOR][COLOR=#0000bb]ICollection
[/COLOR][color=#007700]Implements [/color][COLOR=#0000bb]IEnumerable
    
    [/COLOR][color=#007700]Private [/color][color=#0000bb]_innerList [/color][color=#007700]As [/color][color=#0000bb]ArrayList [/color][color=#007700]= New [/color][color=#0000bb]ArrayList[/color][COLOR=#007700]()
    Public [/COLOR][color=#0000bb]Sub Add[/color][color=#007700]([/color][color=#0000bb]Byval Val [/color][color=#007700]As [/color][color=#0000bb]T[/color][COLOR=#007700])
        [/COLOR][color=#0000bb]_InnerList[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]Val[/color][COLOR=#007700])
    [/COLOR][COLOR=#0000bb]End Sub


[/COLOR][color=#007700]Default Public [/color][color=#0000bb]ReadOnly Property Item[/color][color=#007700]([/color][color=#0000bb]Index [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]T
    Get
        [/COLOR][color=#007700]Return [/color][color=#0000bb]Ctype[/color][color=#007700]([/color][color=#0000bb]_innerList[/color][color=#007700]([/color][color=#0000bb]Index[/color][color=#007700]), [/color][color=#0000bb]T[/color][COLOR=#007700])
    [/COLOR][COLOR=#0000bb]End Get
End Property
End [/COLOR][COLOR=#007700]Class  
[/COLOR][/COLOR]


كود :
[color=#000000][COLOR=#007700]Public class [/color][color=#0000bb]MyList[/color][color=#007700]<[/color][color=#0000bb]T[/color][color=#007700]> : [/color][color=#0000bb]ICollection [/color][color=#007700], [/color][COLOR=#0000bb]IEnumerable
[/COLOR][COLOR=#007700]{
Private [/COLOR][color=#0000bb]ArrayList _innerList [/color][color=#007700]= new [/color][color=#0000bb]ArrayList[/color][COLOR=#007700]();
Public [/COLOR][color=#0000bb]Void Add[/color][color=#007700]([/color][color=#0000bb]T Val[/color][COLOR=#007700])
{
[/COLOR][color=#0000bb]_innerList[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]Val[/color][COLOR=#007700]);
}
Public [/COLOR][color=#0000bb]T this [/color][color=#007700][[/color][color=#0000bb]int index[/color][COLOR=#007700]]
{
    [/COLOR][COLOR=#0000bb]Get
    [/COLOR][COLOR=#007700]{
        Return ([/COLOR][color=#0000bb]Y[/color][color=#007700])[/color][color=#0000bb]_innerList[/color][color=#007700][[/color][color=#0000bb]Index[/color][COLOR=#007700]];
    }
}  
[/COLOR][/COLOR]

استخدامة


كود :
[color=#000000][COLOR=#0000bb]Dim MyList [/color][color=#007700]As New [/color][color=#0000bb]MyList[/color][color=#007700]([/color][color=#0000bb]Of Integer[/color][COLOR=#007700])()
[/COLOR][color=#0000bb]myIntList[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700])

[/COLOR][color=#0000bb]Dim MyStringList [/color][color=#007700]As New [/color][color=#0000bb]MyList[/color][color=#007700]([/color][color=#0000bb]Of String[/color][COLOR=#007700])()
[/COLOR][color=#0000bb]myString[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#dd0000]"1"[/color][COLOR=#007700])  
[/COLOR][/COLOR]

هده كانت مقالة مختصرة عن ال Generics

والسلام عليكم ورحمة الله وبركاتة