PDA

View Full Version : سوال: مشکل در مفهوم لیستی از Interface ها



a.ameri
چهارشنبه 05 تیر 1392, 12:16 عصر
سلام

با توجه به تیکه کد زیر




public Interface X
{ void Y(); }

public class A : X
{
public void Y()
{
//code
}
}

public class B : X
{
public void Y()
{

}
public void d()
{ }
}

List<X> LA = new List<X>();
A a = new A();
B b = new B();
LA.Add(a);
LA.Add(b);


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

a.ameri
پنج شنبه 06 تیر 1392, 07:51 صبح
پس چی شد ؟

wolf_majid
پنج شنبه 06 تیر 1392, 09:05 صبح
سوالتون خیلی گنگه
مشکلتون اینه چطور LA تونست a,b رو add کنه ؟
بخاطر اینکه a,b موافقت کرده اند که حتما" اعضای x را پیاده سازی کنند پس زمانی که کلاس های a,b به اینترفیس x نسبت داده میشند تمامی اعضای x رو دارند و این نسبت دادن مشکلی پیش نمیاره

a.ameri
پنج شنبه 06 تیر 1392, 09:26 صبح
مرسی از راهنماییتون
بله مشکلم همینه
درسته که کلاس ها متعهد شدند که ایترفیس را پیاده کنند ولی کلاس B که یک متد دیگه داره چی ؟

wolf_majid
پنج شنبه 06 تیر 1392, 10:27 صبح
اصلا" مهم نیست
مهم اینه که تمامی اعضای x رو دارند
به این عمل میگن cast (به عبارتی به کلاس های a,b به عنوان x داره نگاه میکنه)

a.ameri
پنج شنبه 06 تیر 1392, 10:33 صبح
پس با اینکار متد d از کلاس B بعد از قرار گرفتن در لیست در دسترس (از بین میره) نیست

wolf_majid
پنج شنبه 06 تیر 1392, 10:40 صبح
جالبی Casting به همینه که از بین نمیره
همونطور که گفتم فقط زاویه دید عوض میشه و اگر شیء به حالت اولش برگرده تمام اطلاعاتش هست

a.ameri
پنج شنبه 06 تیر 1392, 10:43 صبح
مرسی برام خیلی مفید بود

wolf_majid
پنج شنبه 06 تیر 1392, 10:45 صبح
این مثال رو ببینید
public interface X { void Y(); }

public class A : X
{
public void Y()
{
MessageBox.Show("A");
}
}

public class B : X
{
public void Y()
{
MessageBox.Show("B");
}
public void d()
{
MessageBox.Show("Its D metod");
}
}

List<X> LA = new List<X>();
A a = new A();
B b = new B();
LA.Add(a);
LA.Add(b);
LA[1].Y();
B c = (B) LA[1];
c.d();