در قسمت پنجم آموزش شی گرایی در ادامه آموزش قبل دررابطه با اعضا ثابت یا Constants و Abstract Classes که شبیه به کلاس های static هستند و مبحث اصلی و مهم شی گرایی که وراثت نام دارد و بسیار کاربردی است را آموزش داده ایم که در آموزش آینده بیشتر این مبحث را ادامه خواهیم داد.
اعضا ثابت در شی گرا در واقع عضوهایی میباشند که تنها یکبار میتوان برا یآنها مقداری تعیین کرد و در طول برنامه تنها میتوا از مقدارشان استفاده کرد اما دیگر به هیچ عنوان نمیتوان مقدارشان را در طول برنامه تغییر داد در صورت اقدام به تغییر با خطا مواجه خواهید شد.
برای تعیین یک عضو ثابت باید از کلمه کلیدی Const قبل از نام آن استفاده کرد مانند زیر
const double pi = 3.14;
حتی اگز بخواهیم برای اعضا ثابت در کلاس پروپرتی ایجاد کنیم تنها میتوان قسمت get{} پروپرتی را داشت چون میتوان گفت اعضا ثابت اعضا فقط خواندنی میباشند و در صورت وجود قسمت set{} با خطا مواجه خواهید شد. مانند زیر
const double pi = 3.14; public double _pi { get { return pi; } }
نکته دیگر در ارتباط با اعضا ثابت این است که این اعضا مانند اعضای static نمیتوان از طریق شی مربوط به کلاسشان صدا زد بلکه در صورت Public بودن آنهارا باید از طریق نام کلاس صدا زد مانند زیر
البته تنها در صورت وجود پروپرتی از اعضا ثابت میتوان در main برنامه از طریق شی کلاسشان به آنها دسترسی پیدا کرد.
کلاس های Abstract همچون کلاس های Static نمیتوان نمونه ای از انها ایجاد کرد و همچنین در این نمونه از این کلاس ها متدها دارای بدنه نمیباشند و تنها دارای تعریف یا الگو متدها میباشد و تعیین کردن کلاس هایی که از این کلاس ارث بری میکنند بدنه متدهارا مشخص میکنند و در واقع متدهارا پیاده سازی میکنند.مانند مثال زیر
abstract class Shape { public abstract void Draw(); } class Square : Shape { public override void Draw() { Console.WriteLine("Draw Square"); } }
در مثال فوق یک کلاس جدید با نام shape ایجاد کرده ایم و پس از ایجاد کلمه کلیدی abstract را قبل از نام آن ذکر کرده ایم سپس درون بدنه کلاس تنها یک تعریف از یک متد با نام Draw شده که از نوع abstract نیز میباشد و بدنه کلاس بسته میشود در خارج از بدنه کلاس با استفاده از سیستم وراثت (در ادامه بطور مفصل در مورد این موضوع توضیح خواهیم داد) یک کلاس جدید به نام Square که با استفاده از علامت : از کلاس Shape ارث بری میکند را مشخص کرده ایم درون بدنه آن یک override از متد Draw (override نیز در ادامه توضیح خواهیم داد) ایجاد شده که در واقع این کار برای پیاده سازی بدنه متد Draw که از نوع abstract تعریف شده میباشد که یک دستور چاپ ساده قرار داده شده.
وراثت در برنامه نویسی شی گرا بسیار شبیه به وراثت در دنیای خارجی میباشد برای مثال از کلاس جاندار کلاس های بسایر زیادی مشتق میشوند مانند حیوانات و انسانها و … و حتی خود کلاس حیوان به چنین زیر کلاس مشتق میشود مانند خزندگان و پرندگان و .. همانگونهکه مشاهده میکنید این ترتیب مانند یک درخت میباشد که از ریشه که همه زیر شاخه ها از ان ارث میبرند تا اخرین عضو که دیگر به هیچ بخشی تقسیم نمیشود.
درواقع وراثت باعث کاهش کدنویسی در برنامه نویسی میشود که بسیار کارامد خواهد بود برای مثال ما کلاس جدیدی به نام Animal ایجاد میکنیم و آنرا به چند کلاس دیگر مشتق میکنیم که همه آنها از کلاس Animal ارث بری میکندد اما متدهای مخصوص به خود نیز دارند.
کدهای زیر در کلاس Animal نوشته شده
class Animal { public void Eat() { Console.WriteLine("Eatting"); } public void Move() { Console.WriteLine("Moving"); } }
کدهای فوق به عبارتی میتوان گفت ریشه وراثت میباشد و تمامیه کلاسهایی که در ادامه مشتق میشوند از این دو متد درون بدنه کلاس ارث بری میکنند در ادامه یک کلاس را برای ارث بری از این کلاس مشخص کرد ایم به شکل زیر
class Snake : Animal { public void Kill() { Console.WriteLine("Snak can Kill"); } }
عبارات فوق نیز یک کلاس با نام Snake مشخص شده و با علامت : مشخص کرده ایم که از کلاس Animal ارض بری کند سپس درون بدنه آن یک متد مشخص شده که فقط و فقط مربوط به همین کلاس میباشد ودر واقع این متد Kill را نمیتوان در زیرکلاس های دیگر دید. در ادامه کلاس دیگری نیز برای ارث بری از کلاس Animal مشخص کرده ایم به شکل زیر
class Monkey:Animal { public void Jump() { Console.WriteLine("Monkey can jump"); } }
کلاس فوق نیز که مربوط به Monkey میباشد و از کلاس Animal نیز ارث بری میکند دارای یک متد اختصاصی میباشد که تنها برای خود این کلا سقابل دسترسی میباشد به عبارت دیگر میتوان گفت این نمونه زیر کلاس ها که از خاصیت ارث بری استفاده میکنند علاوه بر متدهایی که درون خودشان تعریف میشود از متدها و کل اعضا درون کلا ریشه نیز میتوانند استفاده کنند برای مثال در همین کلاس Monkey یک متد با عنوان Jump تعریف شده که این کلاس علاوه بر اینکه از این متد میتواند استفاده کند از دو متد دیگر که در کلاس Animal با عنوان هایEat() و Move() وجود داشت نیز میتوانند استفاده کنند.
حال درون Main برنامه میتوان شی هایی از هرکدام از کلاسهای مشخص شده ایجاد کرد و عناصر قابل دسترسشان را مشاهده کرد برای مثال عناصر قابل دسترس کلاس Animal به شرح زیر است
عناصر قابل دسترس کلاس Monkey که از کلاس Animal ارث بری میکرد نیز به شکل زیر میباشد
عناصر قابل دسترس کلاس Snake نیز به شرح زیر میباشد