آموزش گام به گام #C (جلسه هشتم: وراثت کلاس در #C)
1398/01/05 11:29 , میلاد صاحب نظر

آموزش گام به گام #C (جلسه هشتم: وراثت کلاس در #C)

وراثت از جمله روش‌های بسیار کارآمد برای تسهیل کد‌نویسی و همچنین روشی برای تحقق رویای دیرین برنامه‌نویسان است. با این ویژگی می‌توانید یک بار کدی را بنویسید  هر چند دفعه که بخواهید از آن در برنامه خود استفاده کنید. با ما همراه باشید.

جلسه اول: آغاز کار با #C جلسه ششم: namespaceها جلسه یازدهم: اندیس گذار یا indexerها جلسه شانزدهم: استفاده از اتریبیوت‌ها جلسه بیست و یکم: متدهای بی‌نام یا anonymous
جلسه دوم: عملگرها، نوع‌ها و متغیرها جلسه هفتم: مقدمه‌ای بر کلاس‌های #C جلسه دوازدهم: ساختار یا structها جلسه هفدهم: enumها جلسه بیست و دوم: موضوعاتی در مورد نوع در #C
جلسه سوم: عبارات کنترلی - گزینشی جلسه هشتم: وراثت کلاس در #C جلسه سیزدهم: واسط یا interfaceها جلسه هجدهم: عملگرهای overloading جلسه بیست و سوم: کار با نوع‌های nullable
جلسه چهارم: عبارات کنترلی - حلقه‌ها جلسه نهم: چند ریختی جلسه چهاردهم: مقدمه‌ای بر delegateها و رویدادها جلسه نوزدهم: کپسوله‌سازی  
جلسه پنجم: متدها جلسه دهم: ویژگی یا propertyها جلسه پانزدهم: مقدمه‌ای بر کنترل خطا یا exception جلسه بیستم: مقدمه‌ای بر generic collectionها  

در این جلسه در مورد وراثت کلاس در #C صحبت می‌کنیم. اهداف ما در این جلسه به شرح زیر هستند:

  • پیاده‌سازی کلاس‌های پایه(base)
  • پیاده‌سازی کلاس‌های مشتق یا زیرمجموعه(derived)
  • مقداردهی اولیه کلاس‌های پایه از طریق کلاس‌های مشتق
  • آموزش فراخوانی اعضای کلاس پایه
  • آموزش مخفی کردن اعضای کلاس پایه

وراثت کلاس در #C یکی از مفاهیم اساسی و اولیه در برنامه‌نویسی شیءگرا است. این مفهوم به شما اجازه می‌دهد از کدهای موجود، مجددا استفاده کنید. با به کارگیری مناسب و موثر از این ویژگی، می‌توانید در زمان برنامه‌نویسی خود صرفه‌جویی کنید.

لیست ۱-۸. وراثت: BaseClass.cs

using System;

public class ParentClass
{
    public ParentClass()
    {
        Console.WriteLine("Parent Constructor.");
    }

    public void print()
    {
        Console.WriteLine("I'm a Parent Class.");
    }
}

public class ChildClass : ParentClass
{
    public ChildClass()
    {
        Console.WriteLine("Child Constructor.");
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();

        child.print();
    }
}

خروجی:

Parent Constructor.
Child Constructor.
I'm a Parent Class.

لیست ۱-۸ دو کلاس را نمایش می‌دهد. کلاس بالایی ParentClass نام داشته و کلاس main با نام ChildClass مورد استفاده قرار گرفته است. هدف این است که با استفاده از کد موجود در ParentClass، یک کلاس فرزند ایجاد کنیم.

ابتدا، باید قصد و هدف خود برای استفاده از ParentClass به عنوان کلاس پایه ChildClass را اعلام و تعریف کنیم. این کار از طریق کد public class ChildClass : ParentClass انجام شده است. با قرار گرفتن عملگر دو نقطه (:) بعد از نام کلاس مشتق و نوشتن نام کلاس پایه در مقابل عملگر دو نقطه، کلاس پایه تعریف و مشخص می‌شود.

نکته: #C فقط از ویژگی وراثت از یک کلاس پشتیبانی می‌کند. در نتیجه، می‌توانید فقط یک کلاس پایه برای ارث‌بری تعریف کنید. اما از طرف دیگر، می‌توانید در #C از ویژگی ارث‌بری از چند واسط (Interface) بهره ببرید. این موضوع در جلسات آینده مورد بحث قرار خواهد گرفت.

ChildClass دقیقا همان قابلیت‌های ParentClass را دارد. به همین دلیل، می‌توانید بگویید که ChildClass یک ParentClass است. این نتیجه در متد ()Main از ChildClass نمایش داده شده است(زمانی که متد ()print فراخوانی شده است).

ChildClass از خودش متد ()print ندارد، بنابراین از متد ()print در کلاس ParentClass استفاده می‌کند. می‌توانید نتایج این تفاسیر را در خط سوم خروجی برنامه مشاهده کنید.

کلاس‌های پایه به صورت خودکار، پیش از کلاس‌های مشتق، نمونه‌سازی می‌شوند. به خروجی لیست ۱-۸ دقت کنید، constructor یا سازنده کلاس ParentClass پیش از سازنده کلاس ChildClass اجرا شده است.

لیست ۲-۸. برقراری ارتباط کلاس مشتق با کلاس پایه: BaseTalk.cs

using System;

public class Parent

{

    string parentString;

    public Parent()

    {

        Console.WriteLine("Parent Constructor.");

    }

    public Parent(string myString)

    {

        parentString = myString;

        Console.WriteLine(parentString);

    }

    public void print()

    {

        Console.WriteLine("I'm a Parent Class.");

    }

}




public class Child : Parent

{

    public Child() : base("From Derived")

    {

        Console.WriteLine("Child Constructor.");

    }

    public new void print()

    {

        base.print();

        Console.WriteLine("I'm a Child Class.");

    }

    public static void Main()

    {

        Child child = new Child();

        child.print();

        ((Parent)child).print();

    }

}

خروجی:

From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

کلاس‌های مشتق می‌توانند در طول نمونه‌سازی با کلاس‌های پایه ارتباط برقرار کنند. لیست ۲-۸ چگونگی انجام این امر را در قسمت تعریف child constructor نمایش داده است. عملگر دو نقطه (:) و کلیدواژه base، سازنده کلاس پایه را با تطابق دادن لیست پارامترها فراخوانی می‌کنند.

اگر عبارت (”base(“From Derived به سازنده کلاس مشتق ضمیمه نشده بود، آنگاه کد به صورت خودکار ()Parent را فراخوانی می‌کرد. اولین خط خروجی، نشان می‌دهد که سازنده کلاس پایه همراه با رشته “From Derived” فراخوانی شده است.

گاهی شاید لازم باشد برای یک متد که در یک کلاس پایه قرار دارد، روش پیاده‌سازی مخصوص به خودتان را ایجاد کنید. کلاس Child با معرفی متد ()print مخصوص به خودش این کار را انجام می‌دهد. متد ()Child print متد ()Parent print را مخفی می‌کند.

تاثیر این کد به این صورت است که متد ()Parent print فراخوانی نمی‌شود، مگر اینکه کار خاصی انجام دهید تا حتما فراخوانی شود.

درون متد ()Child print، ما به صراحت متد ()Parent print را فراخوانی کرده‌ایم. این کار با نوشتن کلیدواژه “base” پیش از نام متد انجام شده است. با استفاده از کلیدواژه base، می‌توانید به همه اعضای عمومی (public) یا حفاظت شده (protected) کلاس پایه دسترسی داشته باشید.

خروجی متد ()Child print در خطوط ۳ و ۴ خروجی برنامه نمایش داده شده است.

روش دیگر دسترسی به اعضای کلاس پایه، از طریق یک cast صریح است. این کار توسط آخرین عبارت کد در متد ()Main از کلاس Child انجام شده است. به یاد داشته باشید که کلاس مشتق در واقع یک کپی کامل از ویژگی‌های کلاس پایه است.

این حقیقت برای ما این امکان را فراهم می‌کند تا روی کلاس مشتق یک Cast انجام دهیم و آن کلاس را به یک instance یا نمونه از کلاس پایه‌اش تبدیل کنیم. آخرین خط خروجی لیست ۲-۸، نشان می‌دهد که متد ()Parent print واقعا اجرا شده است.

به modifier یا تنظیم کننده new در متد ()print از کلاس Child توجه کنید. این modifier باعث می‌شود که این متد بتواند متد ()print از کلاس Parent را مخفی کرده و به وضوح هدف شما را مشخص کند و بگوید که شما نمی‌خواهید عمل چند ریختی صورت گیرد.

بدون تنظیم کننده new، کامپایلر یک پیغام هشدار نمایش می‌دهد تا توجه شما را به این مسئله جلب کند. در جلسه آینده به صورت مفصل در مورد چند ریختی صحبت خواهیم کرد.

خلاصه

حالا که این جلسه را مطالعه کردید، می‌دانید که چطور می‌توان یک رابطه کلاس مشتق / پایه ایجاد کرد. می‌توانید نمونه‌سازی کلاس پایه خود را کنترل کنید و متدهای آن را به طور ضمنی یا صریح فراخوانی کنید. همچنین متوجه شدید که یک کلاس مشتق، در واقع یک کپی از ویژگی‌های کلاسه پایه‌اش است.

منبع: C# - Station

جلسه بعد                                                                جلسه قبل

 مطالب مرتبط

 مقدمه ای بر زبان برنامه نویسی #C و پلتفرم NET Framework.
7 دلیل منطقی برای آموختن #C
 طبقه بندی زبان های برنامه نویسی
به دست آوردن Exceptionها در #C و یافتن همه خطاها
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات