کلاس های تو در تو
Csharp Nested Classes
گاهی لازم است تا کلاسی را درون یک کلاس دیگر تعریف کنیم. مهم ترین دلیل این کار محدود کردن حوزه تعریف و دسترسی به اجزای کلاس داخلی است. در سی شارپ این امکان وجود دارد و روش های متنوعی برای کنترل دسترسی کلاس های بیرونی و درونی به اجزای یکدیگر نیز داریم.
می توان کلاسی را در دل کلاسی دیگر گنجاند. به کلاسی که داخل کلاسی دیگر ایجاد می شود، کلاس nested یا تودرتو می گویند. برای این منظور داخل کلاس موجود کلیک کرده و کد مورد نیاز را برای کلاس جدید وارد کنید، ابتدا کلید واژه ی class، سپس یک اسم و کاراکتر {} را تایپ کنید. حال، کل کلاس را انتخاب کنید. روی انتخاب راست کلیک کرده و گزینه ی Surround With… را انتخاب کنید. در لیستی که ظاهر می شود روی class دوبار کلیک کنید. در مثال زیر کلاسی به نام Inside داخل کلاس دیگری به نام Outside قرار گرفته
1 2 3 4 5 6 | public class Outside { public class Inside { } } |
طبق دستور بالا می توان هر تعداد کلاس که لازم است در کلاس های دیگر جای گذاری کرد. طریقه ی مدیریت و کنترل کلاس تودرتو هیچ تفاوتی با (مدیریت) یک کلاس عادی ندارد. برای مثال، می توان تمامی فیلدها، متدها و properties مورد نیاز را داخل کلاس تودرتو یا کلاس بیرونی (کلاس تودرتو) تعریف کرد. هنگامی که کلاسی را در کلاس دیگر جای گذاری می کنید، هیچ گونه ارتباط (برنامه ای) خاصی بین دو کلاس به وجود نمی آید : یعنی تنها به صرف قرار گرفتن یک کلاس در کلاس دیگر، کلاس تودرتو (nested class یا کلاس درونی) به اعضای کلاس بیرونی (nesting class) دسترسی فوری پیدا نخواهد کرد. در حقیقت، این دو کلاس از هم مجزا هستند. اسم کلاس تودرتو (کلاس درونی) بیرون از کلاس بیرونی قابل رویت نیست. برای دسترسی به کلاس تودرتو بیرون از کلاس بیرونی، باید اسم کلاس تودرتو را هر جایی که می خواهید از آن استفاده کنید، تعریف کنید. اگر می خواهید متغیر Inside را جایی درون برنامه ولی بیرون از Outside تعریف کنید، لازم است اسم آن را تعریف کنید.
Csharp Nested Classes
کلاسهای داخلی (Inner Classes)
کلاسهای داخلی میتوانند به صورت مستقیم به اعضای کلاس دربردارنده خود دسترسی داشته باشند. تنها در صورتی میتوان از این کلاسها شی ساخت که یک شی از کلاس دربردارنده آن وجود داشته باشد.
Csharp Nested Classes
کلاسهای تو در تو استاتیک (Static Nested Classes)
کلاسهای تو در توی استاتیک مستقل از کلاس دربردارنده خود هستند. مستقل به این معنا که برای ایجاد شی از یک کلاس تو در توی استاتیک نیازی به وجود شی از کلاس دربردارنده آن نیست.
Csharp Nested Classes
کلاسهای محلی (Local Classes)
کلاسهای محلی کلاسهایی هستند که در بلاکها (متدها، سازندهها، حلقهها، دستورات شرطی و…) تعریف میشوند و به اعضای کلاسی که درون آن تعریف شدهاند دسترسی دارند.
نکته مهم این که کلاسهای محلی فقط در همان بلاکی که تعریف شدهاند قابل استفاده هستند.
Csharp Nested Classes
کلاسهای ناشناس (Anonymous Classes)
کلاسهای ناشناس مانند کلاسهای محلی هستند با این تفاوت که نام ندارند. وقتی بخواهیم از یک کلاس محلی فقط یک بار استفاده کنیم میتوانیم از کلاسهای ناشناس استفاده کنیم.
کلاسهای ناشناس یک خصوصیت مهم دارند و آن این است که به محض تعریف یک کلاس ناشناس یک شی از آن کلاس ساخته میشود پس بنابراین شما یک بار کلاس ناشناس را تعریف کرده و در همان لحظه یک شی از آن میسازید.
کلاس ناشناسی که ما تعریف میکنیم نباید از دو حالت زیر خارج باشد:
- یک اینترفیس را پیاده سازی کند.
- از یک کلاس مشتق شود. (ارثبری داشته باشد.)