PDA

View Full Version : سوال: تعریف کلاس جنریک



archDevil
سه شنبه 17 تیر 1393, 16:02 عصر
سلام خدمات دوستان عزیز!!!

دوستان این شیوه تعریف کلاس جنریک یعنی چی؟ممنون می شم یه توضیح در موردش بدید


public abstract class Entity<T> where T : Entity<T>
{ }


در واقع سوال من بیشتر اینه که این "where T" یعنی چی و چرا اینجاس؟ البته نه اینکه فقط در مورد این "where T" بگیید!!!! اگه می تونید یه توضیح کلی هم بدید ممنون می شم

parvizwpf
سه شنبه 17 تیر 1393, 16:13 عصر
داره میگه نوعی که برای T استفاده بشه یک چیز نباشه . الان کاربر میتونه هر نوعی که خواست برای استفاده از این کلاس تعریف کنه. شما وقتی میخوای کلاست جند وجهی ازش استفاده بشه اینکارو میکنید توی کتاب c# orielly مطالعه کنیدش.

archDevil
سه شنبه 17 تیر 1393, 17:46 عصر
ممنون از parvizwpf عزیز! می شه دوستان با یکم جزئیات بیشتر توضیح بدن تا بطور کامل درکش کنم ممنون

elec60
چهارشنبه 18 تیر 1393, 09:49 صبح
جنریک‌ها باعث می‌شوند که نوع داده‌ای (data type) المان‌های برنامه در زمان استفاده از آن‌ها در برنامه مشخص شوند. به عبارت دیگر، جنریک به ما اجازه می‌دهد کلاس‌ها یا متدهایی بنویسیم که می‌توانند با هر نوع داده‌ای کار کنند

كلاس جنريك یعنی کلاسی که می‌تواند با چندین نوع داده کار کند برای آشنایی با این نوع کلاس به کد زیر دقت کنید:


using System;
using System.Collections.Generic;

namespace GenericApplication
{
public class MyGenericArray<T>
{
// تعریف یک آرایه از نوع جنریک
private T[] array;

public MyGenericArray(int size)
{
array = new T[size + 1];
}

// بدست آوردن یک آیتم جنریک از آرایه جنریک
public T getItem(int index)
{
return array[index];
}

// افزودن یک آیتم جنریک به آرایه جنریک
public void setItem(int index, T value)
{
array[index] = value;
}
}
}






در کد بالا کلاسی تعریف شده است که می‌تواند بر روی آرایه‌هایی از نوع داده‌ای مختلف عملیات درج و حذف را انجام دهد. برای تعریف کلاس جنریک کافی است عبارت <T> بعد از نام کلاس خود اضافه کنید، سپس همانند سایر کلاس‌ها از این نوع داده ای در کلاس استفاده کنید. در مثال بالا یک آرایه از نوع T تعریف شده است که این نوع، در زمان استفاده مشخص خواهد شد. (یعنی در زمان استفاده از کلاس مشخص خواهد شد که چه نوع آرایه ای ایجاد می‌شود) در کد زیر نحوه استفاده از کلاس جنریک نشان داده شده است، همانطور که مشاهده می‌کنید نوع کلاس int و char در نظر گرفته شده است (نوع کلاس، زمان استفاده از کلاس مشخص می‌شود) و سپس آرایه هایی از نوع int و char ایجاد شده است و 5 آیتم از نوع int و char به آرایه‌های هم نوع افزوده شده است.



class Tester
{
static void Main(string[] args)
{
// تعریف یک آرایه از نوع عدد صحیح
MyGenericArray<int> intArray = new MyGenericArray<int>(5);

// افزودن اعداد صحیح به آرایه ای از نوع عدد صحیح
for (int c = 0; c < 5; c++)
{
intArray.setItem(c, c*5);
}

// بدست آوردن آیتم‌های آرایه ای از نوع عدد صحیح
for (int c = 0; c < 5; c++)
{
Console.Write(intArray.getItem(c) + " ");
}
Console.WriteLine();

// تعریف یک آرایه از نوع کاراکتر
MyGenericArray<char> charArray = new MyGenericArray<char>(5);

// افزودن کاراکترها به آرایه ای از نوع کاراکتر
for (int c = 0; c < 5; c++)
{
charArray.setItem(c, (char)(c+97));
}

// بدست آوردن آیتم‌های آرایه ای از نوع کاراکتر
for (int c = 0; c< 5; c++)
{
Console.Write(charArray.getItem(c) + " ");
}
Console.WriteLine();
Console.ReadKey();
}
}






زمانی که کد بالا اجرا می‌شود خروجی زیر بدست می‌آید:



0 5 10 15 20
a b c d e

محمد فدوی
چهارشنبه 18 تیر 1393, 11:56 صبح
فقط یه نکته در مورد بخش ...where T بدم که توی توضیحات دوستان نبود. بطور کلی وقتی T هیچ شرطی نداره، میشه از هر نوع کلاس یا واسطی‌ (Interface) به عنوان T استفاده کرد. اما فرض کنیم میخوایم کلاسی Generic بنویسیم که فقط T هایی رو قبول کنه که الزاما از نوع کلاس هستن. اینطوری عمل میکنیم:

class GenericClass<T> where T : class { ... }

مثالهای دیگه:
وقتی میخوایم T الزاما از نوع واسط باشه:

where T : interface
وقتی میخوایم T حتما یه سازنده بدون آرگومان داشته باشه:

where T : new()
وقتی میخوایم T خود یا یکی از وارث های IComarable باشه:

where T : IComparable
و...
در ضمن میشه شرایط فوق رو باهم ترکیب کرد تا باز هم نوع ورودی Generic رو تا حد دلخواه محدود کرد.
اینم بگم (هرچند میدونی) که کلاس جنریک الزاما یه پارامتر جنریک نداره. میتونه چند تا داشته باشه... و اون موقع میتونیم محدودیت ها رو از هم جدا کنیم:


class GenericClass<T, U, V>
where T: struct
where U: IComparable, new()
// V is Free :D
{
...
}

برای اطلاعات بیشتر اینجا (http://msdn.microsoft.com/en-us/library/bb384067.aspx) رو ببین.

موفق باشی.