PDA

View Full Version : سوال: اشکال با Generics



Salar Ashgi
جمعه 15 شهریور 1387, 21:07 عصر
سلام به همه دوستان ، اشکال کد زیر در کجاست ؟؟



public static T Add<T>(T a, T b)
{
return a + b;
}


ممنون و متشکر !!!:لبخندساده:

Mahdi.Kiani
جمعه 15 شهریور 1387, 21:21 عصر
سلام به همه دوستان ، اشکال کد زیر در کجاست ؟؟



public static T Add<T>(T a, T b)
{
return a + b;
}


ممنون و متشکر !!!:لبخندساده:

اشکالش اینه که عملگر جمع برای هر نوعی تعریف نشده
اگه موقع فراخوانی ، نوع T را مثلا کلاس A مشخص کنید، عملگر جمع بر روی این کلاس چگونه باید رفتار کند؟

mehdi.mousavi
جمعه 15 شهریور 1387, 21: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, 22:37 عصر
درسته ، مثل Operator Overloading ، در سی پلاس پلاس !!!!

دوستان میشه با یه کد اشکال برنامه رو برطرف کنند ؟؟!!

mehdi.mousavi
جمعه 15 شهریور 1387, 22: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
جمعه 15 شهریور 1387, 23: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
جمعه 15 شهریور 1387, 23:15 عصر
===========================================
اگه بخواهیم که T فقط int , double, string باشه ، چیکار باید کنیم ؟؟؟؟

همچین کاری نمیتونید بکنید!

Salar Ashgi
جمعه 15 شهریور 1387, 23:22 عصر
همچین کاری نمیتونید بکنید


یعنی اگه بخواهیم همان تابع جمع را بدون استفاده از کلاسها ، بنویسیم ، غیر ممکن است؟

mehdi.mousavi
شنبه 16 شهریور 1387, 00:12 صبح
یعنی اگه بخواهیم همان تابع جمع را بدون استفاده از کلاسها ، بنویسیم ، غیر ممکن است؟

این غیر ممکنه که شما بتونید بگید T یکی از سه گزینه String، Int32 و Double میتونه باشه. و الا Operator + که برای این سه تایپی که اسم بردید تعریف شده و نیازی به تعریف مجدد نداره.

Salar Ashgi
شنبه 16 شهریور 1387, 07:58 صبح
این غیر ممکنه که شما بتونید بگید T یکی از سه گزینه String، Int32 و Double میتونه باشه. و الا Operator + که برای این سه تایپی که اسم بردید تعریف شده و نیازی به تعریف مجدد نداره.

=====================================

منم میدونم که Operator جمع روی این 3 نوع داده ای پیاده سازی شده ، ولی منظور من اینه

که ، مثلا میخوام الگوریتم Merge Sort فقط برای int , double باشه ، و نمی خوام بیام برای

هر نوع داده ای یه تابع بنویسم ، یه تابع واسه دو نوع داده ای !!!!

mehdi.mousavi
شنبه 16 شهریور 1387, 11: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: هنوزم که امضاء شما کلی از فضای صفحه رو میگیره. لطفا اینو درستش کنید.