الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس سريع عن الـ Generics

بدأه imadouzoun في 25 نوفمبر 2011 · 6 رد · 1,083 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

في هذا الموضوع سأتحدث عن تقنية الـ Generics أخوتي الكرام مع مثال بسيط و عملي .. فما هي الـ Generics إذا :

هي تقنية أضيفت إلى الـ CLR تتيح لك تحديد بعض خصائص Class بدلاً من تحديد الـ Class الذي تريد استخدامه, فمثلاً يمكنك استخدام الـ Generics عندما تريد أن تكتب دالة فيها بارامتر من Class يحقق الـ (Interface IDbCommand) بدلاً من أن تكتب أكثر من دالة لكل Class يحقق تلك الـ Interface, أو تريد أن تضع قيود على كلاس أغراض لائحة Class List<T> بحيث يكون نوع عناصر هذه الـ List يرث من Base Class و يحقق عدد من الـ Interfaces مثلاً بما يتناسب مع الـ Business Logic خاصتك.

و فيما يلي مثال على استخدام هذه التقنية الرائعة و المثيرة لمطوري الـ .Net :

إفتح مشروع Console و ابدأ كتابة الأكواد اللاحقة بعد نهاية الـ Program Class ...

ليكن لدينا الـ Interface التالية :

 public interface IDataObject
    {

         void Save();
         void Delete();

    }

و ليكن هناك كلاس Student يحقق الـ Interface السابقة الذكر:

 public class Student : IDataObject
    {

        public int Id { get; set; }
        public String Name { get; set; }
        public DateTime BirthDate { get; set; }

        #region IDataObject Implementation

       public void Save()
        {
            Console.Write(String.Format("Saving the student:{0} to database", Name));
            Console.ReadKey(true);
        }

        public void Delete()
        {
            Console.Write(String.Format("Deleting the student:{0} from database", Name));
            Console.ReadKey(true);
        }

        #endregion

    }

الآن سنستخدم تقنية الـ Generics لنحدد بعض صفات كلاس عناصر الـ List بدلاً من تحديد الكلاس نفسه (Student) و ذلك لكي تستطيع الـ List أن تتعامل مع أي كلاس يحقق IDataObject Interface و ليس حصرا الـ Student Class

 public class MyBindingList<T> : BindingList<T> where T : IDataObject
    {

        public void DeleteAll()
        {
            // here I call the Delete method because 
            //every element in the list implement IDataObject

            foreach (var item in this.Items) item.Delete();
        }

        public void SaveAll()
        {

            // here I call the Delete method because 
            //every element in the list implement IDataObject

            foreach (var item in this.Items) item.Save();

        }

    }

لنعد الأن إلى دالة الـ Main في Class Program و نعدلها إلى الشكل التالي:

static void Main()
        {

            MyBindingList<Student> listStudents = new MyBindingList<Student>();

            listStudents.Add(new Student { Name = "Ahmad"});
            listStudents.Add(new Student { Name = "Samer"});

            listStudents.SaveAll();

            listStudents.DeleteAll();

        }

نفذ المشروع و تمتع بمشاهدة النتيجة :)

أرجو الفائدة للجميع

تم تعديل هذه المشاركة بواسطة imadouzoun في 29 نوفمبر 2011 في 23:08

2

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#2

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

اخي اعتقد ان الدرس سيبدو صعبا لإبتدءك بالواجهات, هذا رابط يطرق للـ Generics بنوع من البساطه /index.php?showtopic=77004 وان شاء الله بعد قرائته سيكون درسك سهلا .. وشكرا على مجهودك الرائع ..

1

.:: Wish to become better and better ::.

#3
VB Helper كتب:

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

اخي اعتقد ان الدرس سيبدو صعبا لإبتدءك بالواجهات, هذا رابط يطرق للـ Generics بنوع من البساطه /index.php?showtopic=77004 وان شاء الله بعد قرائته سيكون درسك سهلا .. وشكرا على مجهودك الرائع ..

صحيح .. جيد انك ذكرتني لربما هناك كثير من الأعضاء لا يعرفون ما هي الـ Interface و ما عملها .. ممكن نعمل تعديل بسيط بهيك حالة .. بحيث نضيف درس على الـ Interfaces ..

و بالمناسبة أنا بعد ما ضفت موضوعي هذا لاحظت وجود ردس اخر عن الـ Generics للأستاذ هاني الأتاسي :) بكل الأحوال زيادة الخير خير ..

و شكرا

1

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#4

شكرا لك اخي عى هذا ادرس

لدي اسنفسار بسيط

في المثال ما الفرق بين استخدام IDataObject ك data Type لل list و

BindingList<T> where T : IDataObject

في الحالتين اي كلاس يكون implement from the interface ممكن الممكن استخدامة داخل ال list

وما هي الاستفاده من ال generic عند تحديد النوع ك IDataObject

؟؟

وشكرا جزيلا

#5
R@ND_CiS كتب:

شكرا لك اخي عى هذا ادرس

لدي اسنفسار بسيط

في المثال ما الفرق بين استخدام IDataObject ك data Type لل list و

BindingList<T> where T : IDataObject

في الحالتين اي كلاس يكون implement from the interface ممكن الممكن استخدامة داخل ال list

وما هي الاستفاده من ال generic عند تحديد النوع ك IDataObject

؟؟

وشكرا جزيلا

سؤال جميل جداً .. هنا تكمن فكرة الـ Generics في كونك تستطيع أن تفرض أكثر من قيد على نوع بيانات أغراض الـ List .. مثلاً يمكنك أن تطلب أيضاً أن يحقق الـ Class Student واجهة أخرى أو أن يرث من كلاس آخر ...

شوف معي أخي الكريم :

سأعدل كود كلاس الـ Student ليحقق واجهة أخرى مثلاً IEditableObject راقب معي:

   public class Student : IDataObject, IEditableObject
    {

        public int Id { get; set; }
        public String Name { get; set; }
        public DateTime BirthDate { get; set; }

        #region IDataObject Implementation

        public void Save()
        {
            Console.Write(String.Format("Saving the student:{0} to database", Name));
            Console.ReadKey(true);
        }

        public void Delete()
        {
            Console.Write(String.Format("Deleting the student:{0} from database", Name));
            Console.ReadKey(true);
        }

        #endregion

        #region IEditableObject Implementation

        public void BeginEdit()
        {
            throw new NotImplementedException();
        }

        public void CancelEdit()
        {
            throw new NotImplementedException();
        }

        public void EndEdit()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

و سأعدل كود الـ MyBindingList Class على النحو التالي:

    public class MyBindingList<T> : BindingList<T> where T : IDataObject, IEditableObject
    {

        public void DeleteAll()
        {
            // here I call the Delete method because 
            //every element in the list implement IDataObject

            foreach (var item in this.Items) item.Delete();
        }

        public void SaveAll()
        {

            // here I call the Delete method because 
            //every element in the list implement IDataObject

            foreach (var item in this.Items) item.Save();

        }

    }

في هذه الحالة لن تستطيع استخدام الواجهة IDataObject لوحدها :

  MyBindingList<IEditableObject> listStudents = new MyBindingList<IEditableObject >();

السطر البرمجي السابق سيعطيك Compilation Error

أتمنى أن تكون الفكرة اكتملت :)

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#6

جميل جدا ....

شكرا الان اكتملت الفكرة :)

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…