View Full Version : سوال: اشکال با Generics
Salar Ashgi
جمعه 15 شهریور 1387, 22:07 عصر
سلام به همه دوستان ، اشکال کد زیر در کجاست ؟؟
public static T Add<T>(T a, T b)
{
return a + b;
}
ممنون و متشکر !!!:لبخندساده:
Mahdi.Kiani
جمعه 15 شهریور 1387, 22:21 عصر
سلام به همه دوستان ، اشکال کد زیر در کجاست ؟؟
public static T Add<T>(T a, T b)
{
return a + b;
}
ممنون و متشکر !!!:لبخندساده:
اشکالش اینه که عملگر جمع برای هر نوعی تعریف نشده
اگه موقع فراخوانی ، نوع T را مثلا کلاس A مشخص کنید، عملگر جمع بر روی این کلاس چگونه باید رفتار کند؟
mehdi.mousavi
جمعه 15 شهریور 1387, 22:21 عصر
سلام به همه دوستان ، اشکال کد زیر در کجاست ؟؟
public static T Add<T>(T a, T b)
{
return a + b;
}
ممنون و متشکر !!!:لبخندساده:
سلام.
اشکال اینجاست که Operator ای که شما روی دو Operand مزبور (a و b) دارید اعمال میکنید، (یعنی +) شاید روی T تعریف نشده باشه. در نتیجه این کد قابل کامپایل شدن نیست، مگر اینکه تایپ T رو با کلمه where مشخص کنید و در تایپ مزبور Operator + تعریف شده باشه.
Salar Ashgi
جمعه 15 شهریور 1387, 23:37 عصر
درسته ، مثل Operator Overloading ، در سی پلاس پلاس !!!!
دوستان میشه با یه کد اشکال برنامه رو برطرف کنند ؟؟!!
mehdi.mousavi
جمعه 15 شهریور 1387, 23:59 عصر
درسته ، مثل Operator Overloading ، در سی پلاس پلاس !!!! دوستان میشه با یه کد اشکال برنامه رو برطرف کنند ؟؟!!
سلام.
اینم نحوه انجام اینکار:
public class NewClass
{
public static NewClass operator +(NewClass c1, NewClass c2)
{
//The Operator's logic goes here!
return default(NewClass);
}
}
public class TestClass
{
public static T Add<T>(T a, T b) where T : NewClass
{
return (T)(a + b);
}
}
پاورقی: لطفا امضاتون رو به یه چیز مناسبتری تغییر بدید که حجم زیادی از صفحه رو نگیره!
Salar Ashgi
شنبه 16 شهریور 1387, 00:07 صبح
سلام.
اینم نحوه انجام اینکار:
public class NewClass
{
public static NewClass operator +(NewClass c1, NewClass c2)
{
//The Operator's logic goes here!
return default(NewClass);
}
}
public class TestClass
{
public static T Add<T>(T a, T b) where T : NewClass
{
return (T)(a + b);
}
}
!
===========================================
اگه بخواهیم که T فقط int , double, string باشه ، چیکار باید کنیم ؟؟؟؟
mehdi.mousavi
شنبه 16 شهریور 1387, 00:15 صبح
===========================================
اگه بخواهیم که T فقط int , double, string باشه ، چیکار باید کنیم ؟؟؟؟
همچین کاری نمیتونید بکنید!
Salar Ashgi
شنبه 16 شهریور 1387, 00:22 صبح
همچین کاری نمیتونید بکنید
یعنی اگه بخواهیم همان تابع جمع را بدون استفاده از کلاسها ، بنویسیم ، غیر ممکن است؟
mehdi.mousavi
شنبه 16 شهریور 1387, 01:12 صبح
یعنی اگه بخواهیم همان تابع جمع را بدون استفاده از کلاسها ، بنویسیم ، غیر ممکن است؟
این غیر ممکنه که شما بتونید بگید T یکی از سه گزینه String، Int32 و Double میتونه باشه. و الا Operator + که برای این سه تایپی که اسم بردید تعریف شده و نیازی به تعریف مجدد نداره.
Salar Ashgi
شنبه 16 شهریور 1387, 08:58 صبح
این غیر ممکنه که شما بتونید بگید T یکی از سه گزینه String، Int32 و Double میتونه باشه. و الا Operator + که برای این سه تایپی که اسم بردید تعریف شده و نیازی به تعریف مجدد نداره.
=====================================
منم میدونم که Operator جمع روی این 3 نوع داده ای پیاده سازی شده ، ولی منظور من اینه
که ، مثلا میخوام الگوریتم Merge Sort فقط برای int , double باشه ، و نمی خوام بیام برای
هر نوع داده ای یه تابع بنویسم ، یه تابع واسه دو نوع داده ای !!!!
mehdi.mousavi
شنبه 16 شهریور 1387, 12:03 عصر
=====================================
منم میدونم که Operator جمع روی این 3 نوع داده ای پیاده سازی شده ، ولی منظور من اینه
که ، مثلا میخوام الگوریتم Merge Sort فقط برای int , double باشه ، و نمی خوام بیام برای
هر نوع داده ای یه تابع بنویسم ، یه تابع واسه دو نوع داده ای !!!!
آهان! پس مساله اینه. خوب. کافیه تا تو کلاس MergeSort اتون، IComparable<T> رو Implement کنید. این راه حل درست مساله هستش، نه نوشتن Operator جمع! اینم یه نمونه! (http://dotnetcorner.weblog.com/2008/7/Generic-implementation-of-sorting-algorithms-and-u-2.html)
پاورقی 1: درست پرسیدن سوال، عموما، رفتن نیمی از مسیر جوابه.
پاورقی 2: هنوزم که امضاء شما کلی از فضای صفحه رو میگیره. لطفا اینو درستش کنید.
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.