PDA

View Full Version : یک اینترفیس واسط بین کلاسها



Mrs.Net
یک شنبه 18 فروردین 1387, 14:54 عصر
فرض کنید یک کلاس اشخاص تعریف میکنیم Person
یک کلاس هم داریم یجور لیست کردن آبجکتها هست مثلا

MyList<T>
یک مشخصه برای کلاس اشخاص دارم که داخل کلاس لیست از اون مشخصه استفاده میشه
مثلا یک پارامتر با آن اضافه شده مثل
public string MyParam{get; set; }
و داخل کلاس مای لیستم از این پارامتر استفاده میشه مثلا اینجوری:

T x;
x.MyParam="fixed";
(امیدوارم تا اینجا متوجه شده باشید)
حالا تعداد زیادی از کلاسهایی که شبیه Person هست دارم.
میخوام یک اینترفیس یا کلاس تعریف کنم که:
1. تعریف MyParam داخل اون باشه
2. کلاس پرسن و بقیه از اون کلاس استفاده کنند و در صورت نیاز فقط با آورراید کردن تغییرش بدن
3. کلاس MyList هم بتونه برای همه کلاس ها از MyParam استفاده کنه:

T x;
x.MyParam="fixed";

چجوری؟
(مثل کاری که اینترفیسها انجام میدهند)

mohammad272005
یک شنبه 18 فروردین 1387, 18:33 عصر
اگه درست گرفته باشم:
classProgram
{
staticvoid Main(string[] args)
{
List<Person> people = newList<Person>();
people.Add(newTeacher());
people.Add(newStudent());
}
}
classPerson
{
publicvirtualstring MyParam
{
get;
set;
}
}
classTeacher:Person
{
}
classStudent:Person
{
publicoverridestring MyParam
{
get
{
returnbase.MyParam;
}
set
{
base.MyParam = value;
}
}
}

Mrs.Net
یک شنبه 18 فروردین 1387, 20:08 عصر
ممنون و متاسفانه نه.
من سعی میکنم چیزی که میخوام بنویسم:


class Person{
public string MyParam{
get;
set;
}

}

class MyLists<T>
{
public void Method(){
T x;
x.MyParam="fixed";
}
}
}

class Form1 : Form{

MyList<Person> p=new MyList<Person>();
p.Method();

}


خوب اگه این کدرا امتحان کنید میبینید که از خط

x.MyParam="fixed";
خطا میگیره چون نمیدونه T پارامتری با عنوان MyParam داره یا نداره!
حالا من یک اینترفیس میخوام که به MyList بگه که این T شما حتما MyParam دارد و دیگه خطا نگیره.

mohammad272005
یک شنبه 18 فروردین 1387, 20:44 عصر
حالا فهمیدم
classProgram
{
staticvoid Main(string[] args)
{
MyLists<Person> people = newMyLists<Person>();
}
}
classPerson
{
publicstring MyParam
{
get;
set;
}
}
classMyLists<T>
where T : Person, new()
{
publicvoid Method()
{
T x = new T();
x.MyParam = "fixed";
}
}

با where میتونید بگید type شما حداقل چی هست و با new() میتونید بگیر حداقل یه constructor بدون پارامتر داره.

انشاءالله که اینبار درست باشه.

Mrs.Net
یک شنبه 18 فروردین 1387, 21:40 عصر
بله مشکل حل کرد و کاملا نکته جدیدی بود که یاد گرفتم
البته این از اون راههای بود که یکم اذیت میکنه (مثل وصله کردن میمونه!!)
اما این کلاس MyList من از چندتا کلاس دیگه مشتق شده که انگار با چندتا : مشکل بوجود میاد

classMyLists<T>
where T : Person, new() : MyOtherClass<T>

Mrs.Net
یک شنبه 18 فروردین 1387, 21:57 عصر
فقط کافی بود آخر از همه کلاسها قرار بدم
ممنون آقای محمد