به صورت پیش فرض همه متدها و فیلدهای کلاس به صورت Private تعریف می شود.
استفاده از دو کلاس با نام های یکسان که در حد حروف کوچک و بزرگ متفاوت هستند، صحیح نمی باشد. این کلاس ها در زبان هایی مثال ویژوال بیسیک که به حروف حساس نیست کار نمی کند.
بسته به نوع داده، فیلدهای داخل کلاس با مقادیر 0، false و null مقداردهی می شود اما با این حال بهتر است که مقداردهی به صورت صریح انجام شود.
Constructor متدی هم نام کلاس است که می تواند پارامترهای ورودی دریافت کند اما هیچ خروجی ندارد.
Consructor پیش فرض به آن Constructor ای گفته می شود که پارامتر ورودی نداشته باشد، حالا فرقی ندارد که توسط برنامه نویس ایجاد شده باشد یا توسط کامپایلر.
اگر Constructor کلاسی به صورت Private تعریف شده باشد، یعنی نمی توان از آن کلاس Instance ایجاد کرد در حقیقت هر وقت بخواهیم Instance ساختن کلاس را محدود کنیم بهتر است سراغ AccessModifier گذاشتن برای Constructorآن برویم که از اینکه کلاس را abstract کنیم بهتر است.
اگر خودتان Constructor ایجاد کنید، کامپایلر Constructor پیش فرض را ایجاد نخواهد کرد و در صورت نیاز پیش فرض را نیز خودتان باید پیاده سازی کنید.
از کلاس های Abstract نمی توان Instance ایجاد کرد. در این کلاس های پایه صرفاً تعریف متدها و Property هایی عنوان گردیده و در آینده در کلاس های فرزند توسعه داده خواهند شد. فرزندها می توانند آن متدها یا Property ها را Override کنند. کلاس Abstract حداقل یک متد Abstract باید داشته باشد.
وقتی متدی Abstract است یعنی جزئیات پیاده سازی اش را نمی دانیم و دوست داریم فرزندانش آن را پیاده سازی کنند. پس متد مجرد بدنه ندارد و کلاس فرزند حتماً باید آن را پیاده سازی کند وگرنه خودش هم می شود یک کلاس Abstract
اگر فیلدی در کلاس بصورت static اعلان گردد این بدین معنی است که کامپایلر فقط یک کپی از متغیر مذکور را نگهداری نموده و تمام object ها بایستی بصورت اشتراکی از آن کپی استفاده نمایند. برای اینکار میبایستی از کلمه static قبل از اعلان عضو استفاده نمود. از طریق کلاس می توان به آن فیلد دسترسی داشت.
داده ها و متدهای داخل کلاس به عنوان اعضای کلاس شناخته می شوند. اعضا از نظر دسترسی می توانند حالت های زیر را داشته باشند:
· Public: از خارج کلاس قابل دسترسی هستند. صفاتی هستند که در داخل یک Class وجود داشته،درون یک Class قابلیت خواندن و نوشتن خواهند داشت و در اختیار نمونه هایی که از روی یک کلاس تولید می شوند نیزقرار می گیرند و در داخل اشیاء نیز قابلیت خواندن و نوشتن را خواهندداشت.
· Private: برای کد داخل خود کلاس قابل دسترسی می باشد. صفاتی هستند که درون یک کلاس وجود دارند قابلیت خواندن و نوشتن خواهند داشت اما در اختیار نمونه های تولید شده از کلاس قرار نگرفته و اشیاء دیگر قدرت استفاده از این صفات را نخواهند داشت.
· Protected: برای کلاس های مشتق شده از این کلاس و برای کلاس های In Question قابل دسترسی است. صفاتی هستند که در داخل کلاس و نمونه های تولید شده از کلاس وجود داشته در داخل کلاس به شکل خواندنی و نوشتنی خواهند بود اما درون اشیاء دیگریا به شکل فقط خواندنی یا به شکل فقط نوشتنی ظاهر خواهند شد.
یکی از ویژگی های جدید در C# این است که می توان برای کلاس no-Parameter Constructor نوشت که Static باشد. یکی از دلایل چنین Costructor ای به صورت Static این است که ممکن کلاس مورد نظر دارای فیلدها و یا Properties هایی باشد که نیاز به مقداردهی اولیه داشته باشند قبل از اینکه کلاس مورد استفاده قرار بگیرد.
Constructor ای که از نوع Static است قبل از اولین Call شدن عضوی از اعضای کلاس، اجرا خواهد شد.
Constructor ای که از نوع Static است هیچ AccessModifier ای ندارد. این متد توسط هیچ کدی فراخوانی نمی شود و همیشه توسط Dot Net RunTime قبل از Load شدن کلاس فراخوانی می شود. به همین دلیل Static Constructor نباید پارامتری داشته باشد. یعنی به صورت no-Parameter است و همچنین به همین دلیل فقط یک Static constructor برای هر کلاس می تواند وجود داشته باشد. واضح است که Static Constructor فقط به اعضای Static کلاس می تواند دسترسی داشته باشد و به Instance Member ها نمی تواند دسترسی داشته باشد.
اگر در یک کلاس Static constructor و هم No-Parameter instance Constructor داشته باشیم مشکلی پیش نمی آید زیرا اولی در زمان Load شدن کلاس و دومی در زمانی که از کلاس Instance ساخته می شود اجرا می شوند.
اگر چند کلاس داشته باشیم که Static Constructor دارند، مشخص نیست که Constructor کدامیک ابتدا اجرا می شود. بنابراین نباید در Constructor های Static آنها کدهایی نوشت که به اجرا شدن یا اجرا نشدن یک Static Constructor دیگر وابسته باشد.
اگر یک کلاس عضوی غیر از متدها و Properties های Static نداشته باشد، خود کلاس نیز می تواند به عنوان Static تعریف شود.
یک کلاس Static از نظر کاربرد مانند کلاسی است که private static Constructor دارد. امکان ایجاد Instance از این کلاس وجود ندارد و در صورت ایجاد Instance از چنین کلاسی، خطای کامپایلر به وجود می آید و این خود تضمینی است برای جلوگیری از ایجاد Instance از این کلاس.
کلاس ها می توانند از فقط یک کلاس دیگر که برنامه نویس تعیین می کند مشتق شوند وهمچنین از یک یا چند اینترفیس مشتق شود.
کلاس های Abstract نمی توانند instantiate شوند.
در C# کلاس ها RefrenceType هستند.
با توجه به اینکه Classها قابلیت استفاده مستقیم را ندارند از روی هر کلاس میتوان نمونه یا نمونه هایی را تولید کرد.
بر اساس همین نمونه سازی از کلاس، کلاس ها به سه دسته تقسیم می شوند:
· Multitone Class: کلاس هایی هستند که می توانند بیش از یک نمونه از خود تولید کنند که هر نمونه از نوع یک کلاس منحصر به فرد باشد.
· Singletone Class:کلاس هایی هستند که با آن که می توانند نمونه یا نمونه هایی از خود را تولید کنند اما تنوع تولید نمونه در آنها وجود نداشته وکلیه نمونه ها از روی یک کلاس تولید می شوند.
· Utility Class: کلاس هایی هستند که توانایی تولید هیچ نمونه ای از خود را نخواهند داشت.
ارتباط بین کلاس ها در مدل های شی گرا ارتباط Generalization، Association و Dependency می باشد.
ارتباط Association شامل ارتباطات زیر می باشد:
· Normal: جایی که نمونه های کلاس پیام های را به نمونه های کلاس دیگر ارسال می کند یک ارتباط بین آنها بوجود آمده است.
· Aggrigation: در رابطه تجمع، شی جز به شی کل وابسته نیست. شی کل و جزء در زمانهای مختلف ایجاد و از بین می رود یعنی ممکن است شی جزء را ایجاد کنید بدون اینکه شی کل را یجاد کنید. برای مثال شی موتور و لاستیک را ایجاد می کنید بدون اینکه شی ماشین را ایجاد کنید. یا بر عکس ممکن است شی ماشین را با اشیاء که قبلا وجود داشته اند ایجاد کنیم بدون اینکه نیاز باشد همزمان با ایجاد ماشین، آنها را ایجاد کنیم.برای مثال یک کلاس برای تیم پروژه در نظر بگیرید. و یک کلاس برای کارمندان شرکت در نظر بگیرید. تیم پروژه، از کارمندان شرکت تشکیل شده است. اما ممکن است یک تیم پروژه منحل شود در حالیکه کارمندان به کار خود در شرکت ادامه می دهند.
· Composition: برای مثال یک پنجره در سیستم عامل ویندوز را در نظر بگیرید، یک پنجره از چندین شی تشکیل شده است بعنوان مثال دکمه Minimize، Maximize، Close ، یک منو و .... زمانیکه یک شی پنجره ایجاد می شود همزمان با آن تمام دکمه ها و منو ایجاد می شود. با بستن پنجره تمام اشیاء، پنجره، دکمه ها و منو از بین می روند. امکان ندارد بدون وجود یک شی پنجره یک شی منو ایجاد شود و به کاربر نمایش داده شود یا با بستن و از بین رفتن شی پنجره، شی منو از بین نرود. رابطه ترکیب همان حذف پخش شونده (cascading deletion) است. در یک رابطه ترکیب هنگامیکه رکورد اصلی حذف می شود تمام رکورد های مرتبط با رکورد اصلی حذف می شوند.