آموزش گام به گام #c (جلسه نهم: چندریختی)
1398/01/06 11:40 , میلاد صاحب نظر

آموزش گام به گام #c (جلسه نهم: چندریختی)

تا به حال لازم شده که چند شیء با نوع‌های مختلف  را در یک آرایه قرار دهید؟ به نظر غیر ممکن می‌آید اینطور نیست؟ غیر ممکن نیست. چند ریختی این کار را برای شما انجام می‌دهد. با ما باشید.

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

در این جلسه، موضوع چندریختی در #c آموزش داده خواهد شد. اهداف این جلسه به شرح زیر هستند:

  • تعریف و آموزش چندریختی.
  • پیاده‌سازی یک متد مجازی(virtual).
  • Override کردن(بازنویسی متد‌های به ارث برده شده از کلاس پدر) یک متد مجازی.
  • استفاده از چندریختی در یک برنامه.

یک مفهوم اصلی و پایه دیگر از برنامه‌نویسی شیءگرا مفهوم چندریختی است. چندریختی به شما اجازه می‌دهد تا متدهای کلاس مشتق را از طریق یک رفرنس در کلاس پایه در هنگام run – time  فراخوانی کنید.

این کار زمانی مفید است که شما می‌خواهید گروهی از اشیاء را به یک آرایه اختصاص دهید و سپس هر کدام از متدهای آن‌ها را فراخوانی کنید.

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

در این جلسه چگونگی انجام این کار را به شما نمایش می‌دهیم.

لیست ۱-۹. یک کلاس پایه با یک متد مجازی: DrawingObject.cs

using System;

public class DrawingObject
{
    public virtual void Draw()
    {
        Console.WriteLine("I'm just a generic drawing object.");
    }
}

لیست ۱-۹ کلاس DrawingObject را نشان می‌دهد. این کلاس در واقع کلاس پایه برای اشیایی هستند که از آن کلاس ارث‌بری می‌کنند. این کلاس دارای یک متد به نام ()Draw می‌باشد. متد ()Draw دارای یک تنظیم‌کننده(modifier) مجازی است.

تنظیم‌کننده مجازی به کلاس‌های مشتق می‌گوید که می‌توانند این متد را override کنند. تنها کاری که متد ()Draw از کلاس DrawingObject انجام می‌دهد این است که عبارت “I’m just a generic drawing object” را در کنسول نمایش می‌دهد.

لیست ۲-۹. کلاس‌های مشتق با متدهای override: Line.cs، Circle.cs و Square.cs

using System;

public class Line : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Line.");
    }
}

public class Circle : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Circle.");
    }
}

public class Square : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Square.");
    }
}

لیست ۲-۹ دارای سه کلاس است. این کلاس‌ها از کلاس DrawingObject ارث‌بری می‌کنند. هر کلاس دارای یک متد ()Draw و هر متد ()Draw دارای یک تنظیم‌کننده override است. تنظیم‌کننده override به متد اجازه می‌دهد تا متد مجازی کلاس پایه خودش را در ران تایم override کند.

فقط در صورتی که کلاس از طریق یک رفرنس در کلاس پایه مورد اشاره قرار گرفته باشد، Override اتفاق خواهد افتاد. متدهای Override کننده باید دارای امضا، نام و پارامترهای یکسان باشند، چون متد مجازی کلاس پایه قرار است override شود.

لیست ۳-۹. به کار بردن چندریختی در یک برنامه: DrawDemo.cs

using System;

public class DrawDemo
{
    public static int Main( )
    {
        DrawingObject[] dObj = new DrawingObject[4];

        dObj[0] = new Line();
        dObj[1] = new Circle();
        dObj[2] = new Square();
        dObj[3] = new DrawingObject();

        foreach (DrawingObject drawObj in dObj)
        {
            drawObj.Draw();
        }

        return 0;
    }
}

لیست ۳-۹ برنامه‌ای را نشان می‌دهد که از کلاس‌های تعریف شده در لیست ۱-۹ و لیست ۲-۹ استفاده می‌کند. این برنامه، عمل چندریختی را انجام می‌دهد. در متد ()Main از کلاس DrawDemo، یک آرایه ایجاد شده است.

نوع شیء در این آرایه همان نوع کلاس DrawingObject است. نام آرایه dObj است و می‌تواند با ۴ شیء از نوع DrawingObject مقداردهی شود.

در هنگام مقداردهی اولیه، به خاطر وجود رابطه ارث‌بری اشیاء با کلاس DrawingObject، می‌توان کلاس‌های Line، Circle و Square را به آرایه dObj اختصاص داد. بدون این قابلیت، مجبور خواهید شد برای هر نوع، یک آرایه مجزا ایجاد کنید.

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

بعد از اینکه‌ آرایه مقداردهی اولیه شد، یک حلقه foreach وجود دارد که هر عنصر از آرایه را بررسی می‌کند. درون حلقه foreach، متد ()Draw برای هر عنصر از آرایه dObj فراخوانی می‌شود. به خاطر وجود ویژگی چندریختی، نوع ران تایم از هر شیء فراخوانی می‌شود.

نوع شیء رفرنس از آرایه dObj همان نوع DrawingObject است. به هر حال، این امر اهمیتی ندارد چون کلاس‌های مشتق، متد مجازی ()Draw از کلاس DrawingObject را override می‌کنند.

این باعث می‌شود متد‌های ()Draw از کلاس‌های مشتق که override شده‌اند، زمانی اجرا شوند که متد ()Draw با استفاده از رفرنس کلاس پایه (یعنیDrawingObject) از آرایه dObj فراخوانی شود. خروجی کدهای بالا به این شکل هستند:

خروجی:

I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.

عمل override کردن متد ()Draw از هر کلاس مشتق شده، همان‌طور که در برنامه DrawDemo مشاهده کردید، انجام می‌شود. آخرین خط خروجی از متد مجازی ()Draw از کلاس DrawingObject گرفته شده است.

این امر بدان خاطر است که نوع ران تایم چهارمین عنصر آرایه از نوع شیء DrawingObject است.

می‌توانید کد ارائه شده در این جلسه را با کد خط فرمان زیر کامپایل کنید:

    csc DrawDemo.cs DrawingObject.cs Circle.cs Line.cs Square.cs

این کد فایل DrawDemo.exe را ایجاد می‌کند، که به صورت پیش‌فرض، نام اولین فایل در خط فرمان به عنوان نام فایل Exe انتخاب می‌شود.

خلاصه

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

این رابطه بین متدهای مجازی و متدهای کلاس مشتق که متدهای مجازی را override می‌کنند، عمل چندریختی را امکان‌پذیر می‌سازد.

در این جلسه نشان دادیم که چگونه می‌توان از این رابطه بین کلاس‌ها استفاده کرد تا عمل چندریختی را در یک برنامه انجام داد.

منبع: 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 در جلسه قبلی بررسی شد. این مبحث که ...

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

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

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