PDA

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



habedijoo
دوشنبه 19 شهریور 1386, 14:54 عصر
سلام به همگی

من یک کلاس Base دارم به شکل زیر :


public abstract class Base
{

public virtual void FillData(DataSet ds)
{
/// Sample Code
}

}

و یک کلاس بصورت جنریک تعریف کردم که از کلاس بالا مشتق می شود و می خواهم متد FillData آن را بشکل زیر override کنم که با Error بر میخورم . ایا این مشکل راه حلی دارد.



public abstract class Class2 <Tkey> : Base
where Tkey:DataSet

{
public override void FillData(Tkey ds)
{
base.FillData(ds);
}

}

Mehdi Asgari
دوشنبه 19 شهریور 1386, 15:16 عصر
C# Language Specification 1.2:
When an instance method declaration includes an override modifier, the method overrides an inherited virtual method with the same signature.

امضای تابعت با تابع کلاس Base یکی نیست.
میشه توضیح بدی چرا این کارو میخوای بکنی ؟
این به دردت می خوره؟ :

public abstract class Base <T> where T : DataSet
{
public virtual void FillData(T ds)
{
}
}

class Class2 : Base<SomeClassDerivedFromDataSet>
{
public override void FillData(SomeClassDerivedFromDataSet y)
{

}
}


راستی بهتر نیست abstract رو از روی Class2 برداری ؟!

Mehdi Asgari
دوشنبه 19 شهریور 1386, 15:37 عصر
به اینم یه نگاه بنداز:
Professional .NET 2.0 Generics
(ا فصل 4)

habedijoo
دوشنبه 19 شهریور 1386, 17:34 عصر
کلاس Base نباید جنریک باشه . چون بعدا میخوام از یکی از متدها تمام کلاسهای ایجاد شده بصورت مشترک استفاده کنم .

PC2st
دوشنبه 19 شهریور 1386, 17:45 عصر
این کاری که شما میخواید بکنید نمیشه، چون متد FillData از کلاس Base با متد FillData از کلاس class2 از لحاظ پارامتر فرق میکنه و در واقع نمیتونه که override بشه.

پس برای راه حل،
متد FillData از کلاس Base رو virtual نکنید و یک متد FillData دیگر را در کلاس class2 اورلود (overload) کنید
یا اینکه کلاس Base رو هم generic کنید
یا ...

mohammad272005
دوشنبه 19 شهریور 1386, 23:25 عصر
جز اینکه کلاس base رو هم generic کنید هیچ راه اصولیی ندارید.

habedijoo
سه شنبه 20 شهریور 1386, 07:03 صبح
پس برای راه حل،
متد FillData از کلاس Base رو virtual نکنید و یک متد FillData دیگر را در کلاس class2 اورلود (overload) کنید
یا اینکه کلاس Base رو هم generic کنید
یا ...

تنها راه حل باقیمانده که به ذهن خودم هم رسید دقیقا همین overload بود . ممنونم دوست من .