اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
سلام.
من یه کلاس پدر و چندین کلاس فرزند دارم.
یه تابع میخوام بنویسم که یه لیست برمی گردنه. اون لیست برای هر کلاس فرزند لیستی از خودشه.مثل زیر:
Public class City:ParentClass
{
Public List<City> SelectAll()
{
//
}
}
Public class Activity:ParentClass
{
Public List< Activity> SelectAll()
{
//
}
}
سوالم اینه:
با توجه به اینکه خروجی های متدSelectAll متفاوته میشه کاری کرد که کلاس های فرزند مجبور باشن SelectAll رو پیاده سازی کنن؟
نقل قول: اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
اگر میخوای اجبار به پیاده سازی باشه باید از یه اینترفیس ارث ببرن ولی اینکه میخوای هر کدوم در یک متد مشترک اطلاعات مختص به خودشون رو برگردونن متد موردنظرت رو در کلاس پایه virtual تعریف کن و توی کلاسه های فرزند اون رو اورراید کن
نقل قول: اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
نقل قول:
نوشته شده توسط
esafb52
اینکه میخوای هر کدوم در یک متد مشترک اطلاعات مختص به خودشون رو برگردونن متد موردنظرت رو در کلاس پایه virtual تعریف کن و توی کلاسه های فرزند اون رو اورراید کن
دوست عزیز با توجه به اینکه return type هاشون متفاوته نمیشه اونها رو override کرد.
نقل قول: اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
این شاید کارت رو راه بندازه
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.ToSt ring()
+"\n"+(x as my2).y.ToString()
));
نقل قول: اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
و یا :
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()
));
نقل قول: اجبار کلاس های فرزند به پیاده سازی یک تابع با خروجی های متفاوت
اونی که با Interface نوشته بودید تا حدی کارمو راه انداخت.ممنونم