شاخصها به کلاسهای اجازه میدهند که به صورت یک آرایه مورد استفاده قرار بگیرند! شاید این جمله برای شما تعجب بر انگیز باشد. در فصل گذشته در ارتباط با ویژگیها صحبت کردیم و انواع آنها را مورد بررسی قرار دادیم. در این فصل قصد داریم شاخصها یا Indexer ها را در زبان برنامهنویسی #C مورد تجزیه و تحلیل قرار دهیم.
مقدمه
ناخودآگاه هر وقت صحبت از کلمهی Index میشود ذهن ما به سمت آرایهها میرود. به عبارت دیگر آرایهها از سادهترین اشیاءای هستند که مفهوم Index در آنها وجود دارد. برای آگاهی بیشتر در ارتباط با آرایهها در زبان برنامهنویسی #C مقالهی زیر را مطالعه بفرمایید:
همانطور که در جریان هستید آرایهها در زبان برنامهنویسی #C با علامت [] یا براکت شناخته میشوند.
تعریف شاخص یا Indexer
شاخص یا indexer به نوع خاصی ویژگی یا Property در زبان برنامهنویسی #C گفته میشود که در بدنهی اصلی کلاس تعریف شده و امکان استفاده از عملگر [] را برای نمونهی کلاس فراهم میکند. به عبارت دیگر indexer قابلیتی را فراهم میکند که یک شیء مانند یک آرایه ایندکس شود. نحوهی تعریف indexerها به صورت زیر است:
در اجرای indexer و تعریف آن توجه به نکات زیر ضروریست:
- indexerها میتوانند مانند آرایههای دو بعدی دارای چندپارامتری باشند (Multiple Parameters)
- indexerها قابلیت overloaded دارند
- indexerها علاوه بر مقادیر صحیح عددی، مقادیر رشته یا double را پیادهسازی میکنند.
- از accessor یا دستیاب get برای بازگرداندن مقدار و از set برای تنظیم کردن و مقداردهی استفاده میشود.
- indexerها بر خلاف propertyها نامی ندارند و برای تعریف آنها کافیست از کلمهی کلیدی this استفاده کرد.
همانطور که ملاحظه میکنید تعریف indexer همانند ویژگیها یا propertyها است با این تفاوت که در accessorهای موجود در ویژگیها تنها یک مقدار مشخصی داده return یا بازگردانده میشود در حالیکه در accessorهای indexer یک مقدار خاص از یک شیء بازگردانده میشود. به عبارت دیگر indexer دادههای یک نمونه را به قسمتهای کوچکتر تقسیم کرده و سپس هر قسمت ایندکس شده را get یا set میکند.
به مثال زیر توجه کنید:
در این مثال نحوهی پیادهسازی یک indexer را مشاهده میکنید. ابتدا کلاسی تحت عنوان IntIndexer ایجاد کردهایم که دارای یک ویژگی از نوع آرایهی رشتهای تحت عنوان myData است. این آرایه در سازنده پیشفرض کلاس مقداردهی شده است که به ازای سایز و اندازهی آرایهی myData عبارت empty را درون آنها میریزد. سپس در قسمت بعدی کلاس یک indexer با کلمهی کلیدی this و [] براکت ایجاد شده است. این indexer یک موقعیت را به عنوان پارامتر int pos دریافت میکند. سپس با استفاده از دستیابها یا accessorهای get و set اقدام به فراخوانی یا مقداردهی مجموعهی آرایهی myData میکند. در متد اصلی Main نیز ابتدا یک سایر و اندازه را تعریف کرده و سپس یک نمونه از کلاس IntIndexer ایجاد میکنیم که مقدار پیشفرض را برای سازنده تنظیم و روی متغییر size قرار میدهیم. در نهایت در سه خط مقداردهی آرایهی موجود در شیء را انجام داده و خروجی را برای تمام المانهای موجود در شیء چاپ میکنیم. در نتیجه خروجی این مثال به صورت زیر خواهد بود:
استفاده مجدد یا سربارگیری (Overloaded) در Indexerها
همانطور که در فصول گذشته توضیح دادیم میتوان یک متد و یا تابع را برای چندین نوع متغییر (مثلا int و string) تعریف کرد. بنابراین برای اینکار کافیست آرگومان ورودی به آن متد و تابع را از نوع مختلفی تعریف کرده و خروجی نهایی را با مقدار مشخص آن نوع بازگردانیم. در indexer ها یا شاخصها نیز همین روند ادامه خواهد داشت. به مثال زیر توجه کنید:
همانطور که ملاحظه میکنید تمام روند اجرایی این مثال مشابه مثال قبل میباشد با این تفاوت که یک indexer دیگر با آرگومان ورودی string data از نوع string به مجموعه کلاس اضافه شده است. سپس داخل این indexer تعداد مقادیری که برابر no value هستند را شماره میکند. بنابراین در متد اصلی Main وقتی عبارت myData[“no value” را در اختیار میگیریم در واقع شمارش را برای تعداد مقادیری که برابر با no value هستند را نمایش میدهد. بنابراین خروجی این مقال به صورت زیر خواهد بود:
همچنین میتوان به صورت همزمان به Indexer ها چندین پارامتر اختصاص داد که در مجموعهی دستورهای زیر مشاهده میکنید:
در این بخش به توضیح کامل و دقیق شاخصها یا indexer ها پرداختیم تا شما عزیزان با این ویژگی خاص در زبان برنامهنویسی #C بیشتر آشنا شوید. در فصل بعدی به توضیح مفصل struct ها پرداخته و مثالهایی کاربردی را ارائه خواهیم داد. با ما همراه باشید.
منبع: روکسو