آموزش سی شارپ-قسمت هفتم

سلام با آموزش برنامه نویسی سی شارپ قسمت هفتم در خدمت شما عزیزان هستیم, در قسمت قبلی با Method overloading در زبان C# آشنا شدیم. با ادامه آموزش سی شارپ همراه ما باشید: آموزش سی شارپ : قسمت اول وراثت یا ارث بری (Inhertance) در سی شارپ:یکی از جنبه های کلیدی زبان های برنامه نویسی شی گرا Objected Oriented Programming (OOP) از جمله C# بر پایه آن بنا شده است، مفهوم ارث بری یا Inheritance می باشد. ارث بری یعنی تولید کلاس هایی جدید که برخی از ویژگی های خود را از کلاس مادر Parent Class به ارث برده اند.حتی اگر کل چهارچوب کاری NET. بر پایه مفهوم ارث بری نباشد، ولی جمله معروف "همه چیز شی یا object است" از نتایج آن است. در زبان C#، حتی یک عدد ساده نمونه ای از یک کلاس است که خود از کلاس پایه System.object به ارث رفته است. اگرچه چهارچوب کاری NET.، این امکان را نیز برای شما فراهم کرده تا مقدار مورد نظر خود را مستقیما به یک عدد بدهید، بدون آن که نیاز داشته باشید تا نسخه جدیدی از کلاس Integer ایجاد کنید.شاید بیان مفهوم ارث بری کمی سخت باشد، اما ارایه مثال های عملی کمک شایانی در این زمینه می کند. نمونه کد زیر یک مثال ساده از مفهوم ارث بری در زبان C# است :public class Animal{ public void Greet() { Console.WriteLine(&quotHello, I'm some sort of animal!&quot); }} public class Dog : Animal{}در کد فوق، در مرحله اول یک کلاس به نام Animal Class تعریف کرده ایم و دارای یک متد ساده جهت چاپ پیام خوش آمد گویی است. سپس کلاس Dog را ایجاد کرده و با قرار دادن یک : در مقابل آن، به C# اعلام کرده ایم این کلاس بایستی از کلاس Animal به ارث رود. نکته جالب در مورد مثال فوق این است که رابطه سگ و حیوان نیز در طبیعت به همین صورت می باشد، یعنی Dog زیرمجموعه ای از حیوانات است. اکنون بیایید روش به کار بردن کلاس ها را بررسی کنیم : https://www.aparat.com/v/SaQjI Animal animal = new Animal();animal.Greet(); Dog dog = new Dog();dog.Greet(); اگر کد مثال فوق را اجرا نمایید، خواهید دید با وجودیکه متد Greeting() را برای کلاس Dog تعریف نکرده ایم، اما این کلاس می تواند به پیام خوش آمد بگوید، زیرا متد Greeting() را از کلاس مادر خود یعنی Animal Class به ارث برده است.البته پیام خوش آمدگویی اولیه کد فوق، کمی نامفهوم است. اجازه دهید کدی به مثال قبلی اضافه کنیم تا بدانیم چه حیوانی به ما خوش آمد می گوید!public class Animal{ public virtual void Greet() { Console.WriteLine(&quotHello, I'm some sort of animal!&quot); }} public class Dog : Animal{ public override void Greet() { Console.WriteLine(&quotHello, I'm a dog!&quot); }}در کنار متد اضافه شده به کلاس Dog Class، دو چیز مهم را مشاهده می کنید. ما کلمه کلیدی مجازی (Virtual keyword) را به متد کلاس Animal Class اضافه کرده ایم، از طرف دیگر کلمه کلیدی override را نیز برای کلاس Dog Class به کار برده ایم.در زبان C#، شما نمی توانید عضو (member) یک کلاس را بازنویسی یا override کنید، مگر این که آن را به عنوان virtual تعیین کرده باشید. اگر هم بخواهید، می توانید متد به ارث برده شده را با به کار بردن کلمه کلیدی base، به صورت اولیه خود فراخوانی کنید. به صورت کد مثال زیر:public override void Greet(){ base.Greet(); Console.WriteLine(&quotYes I am - a dog!&quot);}تنها متدها (Methods) نیستند که می توان آن ها را در کلاس ها به ارث برد، سایر اعضای یک کلاس مثل فیلدها (Fileds) و خواص (Properties) نیز خاصیت ارث بری دارند. فقط بایستی به قواعد بازه دسترسی (access modifier) که در درس قبل تشریح کردیم، توجه کنید. ارث بری یا Inheritance فقط مختص یک کلاس به کلاس دیگر نیست. شما می توانید یک سلسله مراتب از کلاس های مرتب به هم را بسازید. برای مثال می توانید یک کلاس به نام Puppy ایجاد کرده که خودش از کلاس Dog به ارث برود، در حالی که Dog فرزند کلاس Animal است.نکته مهم :شما در C# نمی توانید کاری کنید که یک کلاس از چند کلاس مختلف به ارث برود. به این کار ارث بری چندگانه (multiple inheritance) می گویند که در C# پشتیبانی نمی شود.اعضای ایستا یا استاتیک (Static members) در #c:همان طور که در درس های قبل متوجه شدید، رایج ترین راه تعامل و ارتباط با یک کلاس Class، ساخت یک نمونه از آن (شی یا object) و سپس کار کردن بر روی object مورد نظر است. در بیش تر موارد، این کل چیزی است که کلاس شامل می شود، یعنی ساخت چندین نمونه مختلف از یک کلاس و سپس استفاده از هر کدام از آن ها در یک قسمت و یا یک منظور. اما مواردی وجود دارد که تمایل دارید کلاسی داشته باشید که بدون نمونه سازی از آن یا حداقل بدون نیاز به ساخت شی از آن، بتوانید از اعضا و متدهای آن استفاده کنید. برای مثال ممکن است کلاسی داشته باشید که دارای یک متغیر بوده و مقدار این متغیر در همه موارد صرف نظر از محل به کارگیری آن، یکسان است. به این موارد اعضای ثابت یا Static members می گویند، ثابت Static به این دلیل که همواره مقدار آن ها در سطح برنامه یکسان است.یک کلاس می تواند استاتیک Static بوده و یا دارای اعضا و متدهای Static باشد. یک کلاس ثابت Static Class را نمی توانید نمونه سازی کنید. کلاس های ثابت در واقع مجموعه ای member ها هستند تا یک کلاس به معنای واقعی.همچنین شما ممکن است یک کلاس معمولی (non-static) ساخته و برای اعضای آن، ثابت تعریف کنید. یک کلاس غیر ثابت non-static را می توانید نمونه سازی کرده و از روی آن object بسازید، اما نمی توانید از اعضای ثابت آن در شی ها استفاده کنید.کد زیر یک مثال از نحوه تعریف کلاس های ثابت Static Class می باشد : https://www.aparat.com/v/E17fW public static class Rectangle{ public static int CalculateArea(int width, int height) { return width * height; }}همانطور که مشاهده کردید، ما از کلمه کلیدی Static برای مشخص کردن کلاس از نوع ثابت استفاده کرده و همچنین این کلمه کلیدی را نیز برای متد Calculator Area به کار برده ایم. اگر هم برای کلاس و هم برای متد، کلمه کلیدی Static را استفاده نکنید، کامپایلر C# دچار خطا می شود. زیرا یک عضو غیر ثابت (non-Static) را نمی توان در یک کلاس Static تعریف کرد.برای استفاده از متد Calculator، بایستی آن را همانند کد زیر و به صورت مستقیم با کلاس فراخوانی کرد :Console.WriteLine(&quotThe area is: &quot + Rectangle.CalculateArea(5, 4));ما می توانیم متدهای کاربردی دیگری را نیز درون کلاس Rectangle Class تعریف کنیم اما شاید این سوال برایتان پیش آمده، که چرا ما پارامترهای width و height را به جای تعریف در کلاس، مستقیما به متد مقصد پاس داده ایم؟به دلیل این که کلاس فوق به صورت ثابت Static تعریف شده، ما می توانیم مقدار متغیرهای height و width را درون کلاس نگهداری کنیم، اما به صورت ثابت و فقط دارای یک نمونه از مقادیر مثلا 3 و 2 و دیگر نمی توان آن ها را تغییر داد. این نکته مهم را بایستی در کار با توابع Static لحاظ کنید.به جای کد فوق، می توان با غیر ثابت تعریف کردن کلاس، امکان تغییر و انعطاف پذیری کامل را به کلاس خود بدهید. همانند کد مثال زیر :public class Rectangle{ private int width, height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public void OutputArea() { Console.WriteLine(&quotArea output: &quot + Rectangle.CalculateArea(this.width, this.height)); } public static int CalculateArea(int width, int height) { return width * height; }}همانطور که مشاهده می کنید، کلاس را به صورت غیر ثابت non-Static تعریف کرده ایم. همچنین یک تابع سازنده Construction تعریف شده که مقدار پارامترهای Width و height را به نمونه ساخته از کلاس، نسبت می دهد. در پایان هم متد out put Area را جهت محاسبه مساخت به صورت static تعریف کرده ایم. این مثال نمونه خوبی از ترکیب اعضای غیر ثابت و ثابت در یک کلاس non-static می باشد.پایان قسمت هفتم آموزش سی شارپ