آموزش Overload کردن تابع ها در سی شارپ
قبلاً در این فصل، دیدید که چگونه باید وقتی یک تابع را فراخوانی می کنیم، نام و پارامترهای آن را مشخص کنیم. این دلالت دارد بر اینکه ما نیاز داریم برای انجام عملیات روی انواع مختلف متغیرها، تابع های مختلفی را ایجاد کنیم. overload کردن تابع ها به ما امکان می دهد تا با یک نام یکسان، چندین تابع را ایجاد کنیم، اما در هریک از این تابع ها، نوع پارامترها(parameter types) متفاوت باشد. بعنوان مثال، ما قبلاً از کد زیر استفاده کرده ایم که حاوی یک تابع به نام MaxValue() است:
class Program
{
static int MaxValue(int[] intArray)
{
int maxVal = intArray[0];
for (int i = 1; i < intArray.Length; i++)
{
if (intArray[i] > maxVal)
maxVal = intArray[i];
}
return maxVal;
}
static void Main(string[] args)
{
int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
int maxVal = MaxValue(myArray);
WriteLine("The maximum value in myArray is {maxVal}");
ReadKey();
}
}
از این تابع تنها می توانیم با آرایه هایی از مقادیر int استفاده کنیم. اگر بخواهیم پارامترهایی با نوع متفاوتی در تابع ها داشته باشیم، می توانیم تابع هایی با نام های متفاوت ایجاد کنیم. مثلاً اگر تابع قبلی را به صورت IntArrayMaxValue() نام گذاری کنیم و تابع هایی مانند DoubleArrayMaxValue() را نیز اضافه کنیم که با دیگر نوع ها کار کند، مشکل ما حل شود، اما از راهی دیگر، می توانیم تابع زیر را به کدهای خود اضافه کنیم:
static double MaxValue(double[] doubleArray)
{
double maxVal = doubleArray[0];
for (int i = 1; i < doubleArray.Length; i++)
{
if (doubleArray[i] > maxVal)
maxVal = doubleArray[i];
}
return maxVal;
}
تفاوت در اینجا این است که ما داریم از مقادیر double استفاده می کنیم. نام تابع یعنی MaxValue() یکسان است، اما نوع پارامترهای آن متفاوت است. این یک خطا است که دو تابع داشته باشیم که نام و پارامترهای آنها یکسان باشد، اما چونکه نوع پارامترها در این دو تابع متفاوت است، اشکالی ندارد.
نکته: نوع برگشتی یک تابع، بخشی از نام و پارامترهای آن(signature) نیست، بنابراین نمی توانیم دو تابع تعریف کنیم که تنها در نوع برگشتی خود، تفاوت داشته باشند؛ بلکه آنها باید نام و پارامترهای(signature) یکسانی داشته باشند.
پس از اضافه کردن کد بالا، دو نسخه از تابع MaxValue() خواهیم داشت که آرایه هایی از نوع int و double را می پذیرند و به ترتیب حداکثر int یا double را برمی گردانند. زیبایی این نوع کدنویسی این است که لازم نیست صریحاً مشخص کنیم که می خواهیم از کدام یک از این دو تابع استفاده کنیم. بلکه به سادگی یک پارامتر آرایه ای را ارائه می دهیم و تابعِ صحیح، بسته به نوع پارامتری که استفاده می کند، اجرا می شود.
به یک جنبه ی دیگر از ویژگی IntelliSense در ویژوال استودیو توجه کنید: وقتی که در یک اپلیکیشن، دو تابع که در بالا نوشتیم را داشته باشیم و به تایپ کردن نام یکی از این تابع ها ادامه دهیم، (بعنوان مثال تابع Main()) ویرایشگر یا IDE ویژوال استودیو برای آن تابع، overload های در دسترس را نمایش می دهد. بعنوان مثال، اگر عبارت زیر را تایپ کنیم:
double result = MaxValue(
IDE ویژوال استودیو، اطلاعاتی را درباره ی هردو نسخه ی تابع MaxValue() ارائه می دهد؛ که می توانیم با استفاده از فلش های بالا و پایین، بین آنها اسکرول کنیم؛ این موضوع در تصویر 6.11 نشان داده شده است.
(تصویر 6.11)

وقتی که داریم تابع ها را overload می کنیم، تمام جنبه های نام و پارامترهای تابع(signature) اضافه می شوند. بعنوان مثال ممکن است دو تابع مختلف داشته باشیم، که پارامترهایی را به ترتیب توسط مقدار(by value) یا توسط مرجع(by reference) دریافت می کند:
static void ShowDouble(ref int val)
{
...
}
static void ShowDouble(int val)
{
...
}
تصمیم گیری در مورد اینکه از کدام نسخه استفاده کنیم، به این بستگی دارد که آیا در فراخوانی تابع، از کلمه ی کلیدی ref استفاده شده است یا نه. در فراخوانی زیر، از نسخه ی مرجع(reference) استفاده می کنیم:
ShowDouble(ref val);
اما در فراخوانی زیر، از نسخه ی مقدار(value) استفاده می کنیم:
ShowDouble(val);
به طور جایگزین، می توانیم تابع هایی داشته باشیم که در تعداد پارامترهای که نیاز دارند، با یکدیگر متفاوت باشند، و همین طور الی آخر.
- بازدید: 78
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.