PDA

View Full Version : اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت



resident
پنج شنبه 07 شهریور 1392, 16:25 عصر
سلام.
من یه کلاس پدر و چندین کلاس فرزند دارم.
یه تابع میخوام بنویسم که یه لیست برمی گردنه. اون لیست برای هر کلاس فرزند لیستی از خودشه.مثل زیر:




Public class City:ParentClass
{
Public List<City> SelectAll()
{
//
}
}

Public class Activity:ParentClass
{
Public List< Activity> SelectAll()
{
//
}
}



سوالم اینه:
با توجه به اینکه خروجی های متدSelectAll متفاوته میشه کاری کرد که کلاس های فرزند مجبور باشن SelectAll رو پیاده سازی کنن؟

esafb52
جمعه 08 شهریور 1392, 19:15 عصر
اگر میخوای اجبار به پیاده سازی باشه باید از یه اینترفیس ارث ببرن ولی اینکه میخوای هر کدوم در یک متد مشترک اطلاعات مختص به خودشون رو برگردونن متد موردنظرت رو در کلاس پایه virtual تعریف کن و توی کلاسه های فرزند اون رو اورراید کن

resident
شنبه 09 شهریور 1392, 11:00 صبح
اینکه میخوای هر کدوم در یک متد مشترک اطلاعات مختص به خودشون رو برگردونن متد موردنظرت رو در کلاس پایه virtual تعریف کن و توی کلاسه های فرزند اون رو اورراید کن
دوست عزیز با توجه به اینکه return type هاشون متفاوته نمیشه اونها رو override کرد.

wolf_majid
شنبه 09 شهریور 1392, 11:50 صبح
این شاید کارت رو راه بندازه
public interface ITest<T> where T:class
{
List<T> SelectAll();
}

internal class my1 : ITest<my1>
{
public int x;
public List<my1> SelectAll()
{
return new List<my1>{this};
}
}

internal class my2 : my1
{
public int y;
}

تست :
my1 m1=new my1();
m1.x = 10;
my2 m2=new my2();
m2.x = 20;
m2.y = 100;

m2.SelectAll().ForEach(x=>MessageBox.Show(x.x.ToString()
+"\n"+(x as my2).y.ToString()
));

wolf_majid
شنبه 09 شهریور 1392, 12:00 عصر
و یا :
public abstract class AbsClass<T> where T:class
{
public abstract List<T> SelectAll();
}

internal class my1 :AbsClass<my1>
{
public int x;

public override List<my1> SelectAll()
{
return new List<my1>{this};
}
}

internal class my2 : my1
{
public int y;
public override List<my1> SelectAll()
{
return new List<my1>{this};
}
}

تست :
my1 m1 = new my1();
m1.x = 10;
my2 m2 = new my2();
m2.x = 20;
m2.y = 100;

m2.SelectAll().ForEach(x => MessageBox.Show(x.x.ToString()
+ "\n" + (x as my2).y.ToString()
));


بدون جنریک :
public abstract class AbsClass
{
public abstract List<AbsClass> SelectAll();
}

internal class my1 :AbsClass
{
public int x;


public override List<AbsClass> SelectAll()
{
return new List<AbsClass>{this};
}
}

internal class my2 : my1
{
public int y;
public override List<AbsClass> SelectAll()
{
return new List<AbsClass>{this};
}
}

تست :
my1 m1 = new my1();
m1.x = 10;
my2 m2 = new my2();
m2.x = 20;
m2.y = 100;

m2.SelectAll().ForEach(x => MessageBox.Show((x as my2).x.ToString()
+ "\n" + (x as my2).y.ToString()
));

resident
دوشنبه 11 شهریور 1392, 16:35 عصر
اونی که با Interface نوشته بودید تا حدی کارمو راه انداخت.ممنونم