دسته بندی وبلاگ

چند ريختي (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("  Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine(" Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("  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 است.

خلاصه
در اين درس با مفهوم كلي چند ريختي آشنا شديد. چند ريختي امكاني است كه مخصوص زبان‌هاي برنامه‌نويسي شي‌گرا است و از طريق آن مي‌توان براي يك متد موجود در كلاس پايه، چندين پياده‌سازي متفاوت در كلاسهاي مشتق شده داشت.

نظرات برای این نوشته

سیامک عباسی


متن نظر :

ممنون خوب بود


سیامک عباسی


متن نظر :

ممنون..خوب بود