قبل از C# 3.0 فقط میشد یک کلاس را از طریق ارثبری از آن توسعه داد و به کلاس مهروموم شده یاSealed نیز نمیشد تابعی افزود که البته ممکن است بگویید که این کار قوانین شیءگرایی را نقض میکند اما در پاسخ باید گفت که توابع تعمیم یافته به اعضاء خصوصی کلاسی که تعمیم مییابد، دسترسی ندارند.
تعمیم یک کلاس در خارج از بدنه کلاس انجام میشود و این کار میتواند در فضای نام همان کلاس یا خارج از آن انجام شود و شکل کلی آن به صورت زیر است:
public static class ExtendingClassName { public static ReturnType MethodName(this ExtendedMethod arg) { //دستورات درون متد Return ReturnType; } }
- کلاس توسعهدهنده و تابع توسهدهنده باید استاتیک باشند.
- در داخل آرگومان تابع، کلمه کلیدی this استفاده میشود.
- بعد از this عنوان کلاسی که قصد توسعه آن را داریم، ذکر میکنیم.
- در هرجا که خواستیم از قابلیت تعمیم داده شده استفاده کنیم باید فضای نام مربوط به آن را ذکر کنیم.
- با
کلمه کلیدی static نمیتوان کلاسی با متدهایvirtual ، abstract و override را توسعه داد.
مثلا اگر قصد داریم به کلاس 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(); }