آموزش سی شارپ-آموزش تصویری #C

سلام با آموزش برنامه نویسی سی شارپ قسمت هشتم در خدمت شما عزیزان هستیم, در قسمت قبلی با وراثت یا ارث بری (Inhertance) و اعضای ایستا یا استاتیک در زبان C# آشنا شدیم. با ادامه آموزش سی شارپ همراه ما باشید.کلاس انتزاعی (Abstract Class) در #Cکلاس های انتزاعی (Abstract Class) در زبان C#، که با کلمه کلیدی abstract مشخص می شوند، کلاس های پایه و مادر در یک سلسله مراتب درختی کلاس ها می باشند. به عبارت دیگر این کلاس ها، کلاس مرجع بوده و بقیه کلاس ها به ترتیب از روی این کلاس به ارث می روند.نکته :مسئله مهم در مورد کلاس های انتزاعی (Abstract) این است که شما نمی توانید یک نمونه یا شی از روی این کلاس ها بسازید، اگر این کار را انجام دهید، با خطای کامپایلر مواجه خواهید شد.به جای عدم امکان ساخت شی از روی کلاس های انتزاعی، می توانید یک کلاس فرزند یا Subclass همانطور که در درس قبل آموزش دادیم، را از روی کلاس انتزاعی ساخته و سپس object های خود را از روی کلاس فرزند تولید کنید. https://www.aparat.com/v/19Yhx اما چه زمانی ممکن است به کلاس های پایه نیاز داشته باشید؟ به بیان ساده و شفاف، شما می توانید یک پروژه را کامل کدنویسی کنید بدون این که نیازی به کلاس پایه داشته باشید. اما این نوع کلاس ها برای یک منظور خاص، بسیار مناسب بوده و آن کاربرد در چهارچوب کاری یا Framework ها می باشد. به همین دلیل است که چهارچوب کاری .NET پر از کلاس های انتزاعی است.در کد کلاس زیر، ما یک کلاس پایه به نام Four Legged Animal (چهارپایان) را ایجاد کرده و سپس کلاس دیگری به نام Dog تعریف نموده که از کلاس پایه به ارث می رود.namespace AbstractClasses{ class Program { static void Main(string[] args) { Dog dog = new Dog(); Console.WriteLine(dog.Describe()); Console.ReadKey(); } } abstract class FourLeggedAnimal { public virtual string Describe() { return &quotNot much is known about this four legged animal!" } } class Dog : FourLeggedAnimal { }اگر کد مثال فوق را با مثال های درس قبل (آموزش مفهوم ارث بری در C#) مقایسه کنید، تفاوت چندانی بین آن ها مشاهده نخواهید کرد. درواقع کلمه کلیدی abstract در جلوی نام کلاس FourLeggedAnimal مهم ترین تفاوت این مثال هاست. همانطور که مشاهده می کنید، ما یک نمونه از کلاس Dog را ایجاد کرده و سپس متد به ارث برده شده Describe() را از کلاس FourLeggedAnimal فراخوانی کرده ایم. اکنون بیایید یک نمونه از کلاس FourLeggedAnimal را ایجاد کنیم، به صورت کد زیر :FourLeggedAnimal someAnimal = new FourLeggedAnimal();اما شما با خطای کامپایلر مواجه خواهید شد. شرح خطا به صورت زیر است :<i>Cannot create an instance of the abstract class or interface 'AbstractClasses.FourLeggedAnimal'</i>همان طور که در مثال قبل دیدید، ما متد به ارث رفته Describe() را فراخوانی کردیم، اما در حقیقت کاربرد چندانی برای ما نداشت. لذا بیایید توسط کد زیر آن را بازنویسی یا override کنیم : https://www.aparat.com/v/s6AOp class Dog : FourLeggedAnimal{ public override string Describe() { return &quotThis four legged animal is a Dog!" }}در کد مثال فوق، به طور کامل متد را بازنویسی یا Override کردیم. اما گاهی ممکن است شما بخواهید رفتار را از کلاس پایه به ارث برده و مقدار کد نیز به آن اضافه کنید. برای این منظور بایستی از کلمه کلیدی base استفاده نموده که اشاره به کلاسی دارد که از آن inherit کرده ایم. به صورت کد زیر :abstract class FourLeggedAnimal{ public virtual string Describe() { return &quotThis animal has four legs." }} class Dog : FourLeggedAnimal{ public override string Describe() { string result = base.Describe(); result += &quot In fact, it's a dog!" return result; }}اکنون می توانید کلاس های فرزند subclass دیگری را نیز برای کلاس FourLeggedAnimal درست کنید.مطالعه کامل تر کلاس های پایه Abstract Class در #C:در این درس، قصد داریم مثال درس قبل را کمی گسترش داده و در آن از متدهای ثابت Abstract Methods نیز استفاده کنیم. کد تعریف کلاس های ثابت همانند یک متد معمولی است ولی کدی درون آن ها نوشته نمی شودabstract class FourLeggedAnimal{ public abstract string Describe();}اما چرا می خواهیم یک متد خالی را تعریف کنیم، در حالی که کاری برایمان انجام نمی دهد؟به دلیل این که متد پایه (Abstract Method) یک تعمد یا اجبار است تا آن متد در تمامی کلاس های فرزند کلاس جاری اجرا شود. درواقع، به وسیله این کار در زمان اجرای برنامه چک می کنیم، آیا تمامی کلاس های فرزند، این تابع را در خود تعریف کرده اند یا خیر.یک بار دیگر اشاره داریم که این روش بهترین روش برای تعیین یک کلاس پایه برای چیزی در برنامه است، در حالی که می توانیم کنترل کنیم، کلاس فرزند یا subclass چه کارهایی را بایستی قادر باشد، انجام دهد.با در نظر گرفتن مطلب فوق، شما همواره می توانید کاری کنید تا یک کلاس فرزند subclass همانند کلاس پایه عمل کند. برای مثال، به کد مثال زیر دقت کنید :namespace AbstractClasses{ class Program { static void Main(string[] args) { System.Collections.ArrayList animalList = new System.Collections.ArrayList(); animalList.Add(new Dog()); animalList.Add(new Cat()); foreach(FourLeggedAnimal animal in animalList) Console.WriteLine(animal.Describe()); Console.ReadKey(); } } abstract class FourLeggedAnimal { public abstract string Describe(); } class Dog : FourLeggedAnimal { public override string Describe() { return &quotI'm a dog!" } } class Cat : FourLeggedAnimal { public override string Describe() { return &quotI'm a cat!" } }} همانطور که در کد مثال مشاهده می کنید، ما یک لیست آرایه ای ArrayList شامل نام چند حیوان را درست کرده ایم. سپس یک نمونه جدید از Dog و Cat را ایجاد و به لیست اضافه کرده ایم. در شی ذکر شده، نمونه هایی ایجاد شده از کلاس Dog وCat هستند، از طرف دیگر نوعی از کلاس FourLeggedAnimal نیز محسوب می شوند. تا زمانی که کامپایلر می داند که کلاس فرزند متعلق به کلاس پایه است، می توانید متد Describe() را فراخوانی و اجرا کنید، بدون این که دقیقا نوع حیوان شی را بدانید.بنابراین با انجام عمل تبدیل نوع داده ای (TypeCasting) که در حلقه foreach loop برای کلاس FourLeggedAnimal انجام دادیم، به اعضای کلاس فرزند subclass دسترسی پیدا کردیم. این کار در بسیاری از موارد سودمند خواهد بود.پایان قسمت هشتم آموزش سی شارپ