درس نهم _ چند ریختی (Polymorphism)
در این درس به بررسی چند ریختی در زبان C# خواهیم پرداخت. اهداف این درس عبارتند از :
چند ریختی چیست؟
پیادهسازی متد مجازی (Virtual Method)
Override کردن متد مجازی
استفاده از چند ریختی در برنامهها
یکی دیگر از مفاهیم پایهای در شیگرایی، چند ریختی (Polymorphism) است. با استفاده از این ویژگی، میتوان برای متد کلاس مشتق شده پیادهسازی متفاوتی از پیادهسازی متد کلاس پایه ایجاد نمود. این ویژگی در جایی مناسب است که میخواهید گروهی از اشیاء را به یک آرایه تخصیص دهید و سپس از متد هر یک از آنها را استفاده کنید. این اشیاء الزاما نباید از یک نوع شیء باشند. هرچند اگر این اشیاء بواسطه ارثبری به یکدیگر مرتبت باشند، میتوان آنها را بعنوان انواع ارثبری شده به آرایه اضافه نمود. اگر هر یک از این اشیاء دارای متدی با نام مشترک باشند، آنگاه میتوان هر یک از آنها را جداگانه پیادهسازی و استفاده نمود. در این درس با چگونگی انجام این عمل آشنا میگردید.
متد مجازی (Virtual Method)
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
مثال 1-9 کلاس DrawingObject را نشان میدهد. این کلاس میتواند بعنوان کلاسی پایه چهت کلاسهای دیگر در نظر گرفته شود. این کلاس تنها دارای یک متد با نام Draw() میباشد. این متد دارای پیشوند virtual است. وجود کلمه virtual بیان میدارد که کلاسهای مشتق شده از این کلاس میتوانند، این متد را override نمایید و آنرا به طریقه دلخواه پیادهسازی کنند.
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.");
}
}
در مثال 2-9، سه کلاس دیده میشود. این کلاسها از کلاس DrawingObject ارثبری میکنند. هر یک از این کلاسها دارای متد Draw() هستند و تمامی آنها دارای پیشوند override میباشند. وجود کلمه کلیدی override قبل از نام متد، این امکان را فراهم مینماید تا کلاس، متد کلاس پایه خود را override کرده و آنرا به طرز دلخواه پیادهسازی نماید. متدهای override شده باید دارای نوع و پارامترهای مشابه متد کلاس پایه باشند.
پیادهسازی چند ریختی
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;
}
}
مثال 3-9 برنامهای را نشان میدهد که از کلاسهای مثال 1-9 و 2-9 استفاده میکند. در این برنامه چند ریختی پیادهسازی شده است. در متد Main() یک آرایه ایجاد شده است. عناصر این آرایه از نوع DrawingObject تعریف شده است. این آرایه dObj نامگذاری شده و چهار عضو از نوع DrawingObject را در خود نگه میدارد.
سپس آرایه dObj تخصیصدهی شده است. به دلیل رابطه ارثبری این عناصر با کلاس DrawingObject، عناصر Line، Circle و Square قابل تخصیص به این آرایه میباشند. بدون استفاده از این قابلیت، قابلیت ارثبری، برای هر یک از این عناصر باید آرایهای جدا میساختید. ارثبری باعث میشود تا کلاسهای مشتق شده بتوانند همانند کلاس پایه خود عمل کنند که این قابلیت باعث صرفهجویی در وقت و هزینه تولید برنامه میگردد.
پس از تخصیصدهی آرایه، حلقه foreach تک تک عناصر آنرا پیمایش می کند. درون حلقه foreach متد Draw() برای هر یک از اعضای آرایه اجرا میشود. نوع شیء مرجع آرایه dObj، DrawingObject است. چون متد Draw() در هر یک از این اشیاء override میشوند، از اینرو متد Draw() مربوط به هر یک از این اشیاء اجرا میشوند. خروجی این برنامه بصورت زیر است :
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
متد override شده Draw() مربوط به هر یک از کلاسهای مشتق شده در برنامه فوق همانند خروجی اجرا میشوند. آخرین ط خروجی نیز مربوط به کلاس مجازی Draw() از کلاس DrawingObject است، زیرا آخرین عنصر آرایه شیء DrawingObject است.
خلاصه
در این درس با مفهوم کلی چند ریختی آشنا شدید. چند ریختی امکانی است که مخصوص زبانهای برنامهنویسی شیگرا است و از طریق آن میتوان برای یک متد موجود در کلاس پایه، چندین پیادهسازی متفاوت در کلاسهای مشتق شده داشت.