توابع تعمیم یافته در #C
نویسنده: سیدمجتبی حسینی
تاریخ: ۱۳۹۱/۰۷/۰۲ ۱:۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
قبل از C# 3.0 فقط میشد یک کلاس را از طریق ارثبری از آن توسعه داد و به کلاس مهروموم شده یاSealed نیز نمیشد تابعی افزود که البته ممکن است بگویید که این کار قوانین شیءگرایی را نقض میکند اما در پاسخ باید گفت که توابع تعمیم یافته به اعضاء خصوصی کلاسی که تعمیم مییابد، دسترسی ندارند.
تعمیم یک کلاس در خارج از بدنه کلاس انجام میشود و این کار میتواند در فضای نام همان کلاس یا خارج از آن انجام شود و شکل کلی آن به صورت زیر است:
public static class ExtendingClassName
{
public static ReturnType MethodName(this ExtendedMethod arg)
{
//دستورات درون متد
Return ReturnType;
}
}
مثلا اگر قصد داریم به کلاس String تابع AddPrefix را اضافه کنیم به این شکل عمل میکنیم :
public static class ExtendingString
{
public static string AddPrefix(this string arg)
{
return String.Format("prefix{0}",arg);
}
}
که نحوه استفاده از آن به شکل زیر است:
string s = "Student"; Console.WriteLine(s.AddPrefix());
و خروجی آن نمایش prefixStudent است.
اگر بخواهیم عبارت پیشوند را از طریق آرگومان ارسال کنیم به این شکل عمل میکنیم:
public static class ExtendingString
{
public static string AddPrefix(this string arg, string prefix)
{
return String.Format("{0}{1}", prefix, arg);
}
}
که نحوه استفاده از آن به شکل زیر است:
var s = "Student";
Console.WriteLine(s.AddPrefix("tbl"));
و خروجی آن نمایش tblStudent است.
به عنوان مثال دوم کلاس زیر را در نظر بگیرید:
public class Test
{
public int AddOne(int val)
{
return val + 1;
}
}
اگر بخواهیم کلاس فوق را توسعه داده و متد دیگری مثلا با عنوان AddTwo اضافه کنیم، کلاس توسعه دهنده را به این شکل مینویسیم:
public static class ExtendingTest
{
public static int AddTwo(this Test arg, int val)
{
return val + 2;
}
}
و روش استفاده از آن بصورت زیر است:
static void Main(string[] args)
{
var x = new Test();
Console.WriteLine(x.AddOne(10));
Console.WriteLine(x.AddTwo(10));
Console.Read();
}
البته توسعه تعداد توابع نیز به نوعی توسعه توابع است و الزامی ندارد فقط یک تابع توسعه یابد تا تعمیم و توسعه صدق کند
البته الحاق هم صحیح است .
نکته دیگر آنکه برای متد و فانکشن و مانند آن در فارسی معادلی غیر تابع ندیدهام که متداول باشد. بعلاوه آنکه تابع مفهوم همه اینها را شامل میشود خواه نوع بازگشتی داشته باشد یا void باشد، لذا تعبیر غیر صحیحی نیست
باتشکر