PDA

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



bftarane
دوشنبه 08 مهر 1392, 11:43 صبح
می خواستم بدونم چطور میشه از دو متد به صورت زیر که خروجی هاشون متفاوت است استفاده کنم؟

public OleDbDataReader sqlselect(string sql)
{

return drr;
}


public DataTable sqlselect(string sql)
{

return dtt;
}
من اینا رو در یک کلاس نوشتم ولی وقتی کلاس رو New می کنم و می خوام این متدها رو صدا بزنم فقط اولی رو می یاره. اصلاً میشه این کار رو کرد یا اسم رو حتماً باید عوض کنم؟

behzadkhatari
دوشنبه 08 مهر 1392, 12:03 عصر
نیازی به نوشتن دو تابع متفاوت نیست. خروجی رو object تعریف کنید و بعد موقع استفاده اونو cast کنید. من خودم از همین روش استفاده کردم

bftarane
دوشنبه 08 مهر 1392, 12:19 عصر
مرسی آخه دستورات داخل دو متد با هم متفاوت هستند چه جوری باید تشخیص بده که کدومشون هست؟
به نظرم اصلاً سوالم غیر منطقی بود. خودم فکر می کنم باید حتماً اسمش رو عوض کنم.
ولی جواب شما هم جالب بود یه جاهایی به درد می خوره.

مهرداد صفا
دوشنبه 08 مهر 1392, 12:21 عصر
با سلام.
برای overload کردن حداقل باید نوع و یا تعداد آرگومنتها متفاوت باشد. تعریف دو متود همنام با آرگومنتهای یکسان (حتی با خروجی متفاوت) صحیح نیست و خطای زمان Compile را همراه خواهد داشت.

behzadkhatari
دوشنبه 08 مهر 1392, 12:28 عصر
مرسی آخه دستورات داخل دو متد با هم متفاوت هستند چه جوری باید تشخیص بده که کدومشون هست؟
به نظرم اصلاً سوالم غیر منطقی بود. خودم فکر می کنم باید حتماً اسمش رو عوض کنم.
ولی جواب شما هم جالب بود یه جاهایی به درد می خوره.

شما یک پارامتر type تعریف کنید که مثلا اگه 1 بود یک خروجی رو برگردونه 2 بود یک خروجی دیگه.کافیه یک switch بذارید و کاراتون رو انجام بدید

shahryari
دوشنبه 08 مهر 1392, 13:11 عصر
ضمن تایید حرفهای دوست عزیز مهرداد ، شما تازمانی که پارامترهای ورودیتان یکسان باشد ، نمیتوانید تابعتان اورلود کنید
برای این منظور میتوانید یک enum تعریف کنید و در پارمتر دوم این رو درخواست کنید و با شرط مورد بررسی قرار دهید و خروجیتون رو نسبت به اون ارسال کنید
فقط نوع خروجی تابع باید از نوع ابجکت باشد
مثال ساده :
public enum Mytype : int
{
dataTable = 0 ,
OleDbDataReader= 1
}
public Object sqlselect(string sql , Mytype T)
{
if ( T == Mytype.dataTable )
{
DataTable dt = new DataTable() ;
return (DataTable)dt;
}
else
{
System.Data.OleDb.OleDbDataReader dr = new System.Data.OleDb.OleDbDataReader ();
return (System.Data.OleDb.OleDbDataReader)dr;
}
}