| عناوین بحث ها | ارسال کننده | پاسخها | بازدید | بروز رسانی | اولویت | |
|---|---|---|---|---|---|---|
|
|
2
|
7
|
91/3/11 (02:50)
|
|
||
|
|
22
|
292
|
91/2/13 (16:11)
|
|
||
|
|
0
|
1
|
90/12/2 (17:13)
|
|
||
|
|
0
|
0
|
90/11/26 (07:19)
|
|
||
|
|
2
|
8
|
90/10/9 (19:23)
|
|
||
|
|
1
|
11
|
90/9/11 (13:07)
|
|
||
|
|
0
|
2
|
90/9/5 (06:16)
|
|
||
|
|
1
|
2
|
90/8/30 (15:50)
|
|
||
|
|
0
|
6
|
90/8/3 (22:01)
|
|
||
|
|
0
|
9
|
90/6/21 (19:08)
|
|
||
|
|
0
|
1
|
90/6/21 (19:08)
|
|
||
|
|
0
|
1
|
90/6/15 (11:04)
|
|
||
|
|
1
|
16
|
90/3/30 (13:30)
|
|
||
|
|
1
|
12
|
90/3/30 (13:21)
|
|
||
|
|
4
|
38
|
90/2/19 (19:30)
|
|
||
|
|
0
|
9
|
90/2/12 (12:19)
|
|
||
|
|
0
|
4
|
90/1/27 (09:26)
|
|
||
|
|
0
|
3
|
89/12/7 (13:12)
|
|
||
|
|
0
|
20
|
89/11/24 (16:14)
|
|
||
|
|
0
|
13
|
89/11/9 (17:05)
|
|
یكی دیگر از مفاهیم پایهای در شیگرایی، چند ریختی (Polymorphism) است. با استفاده از این ویژگی، میتوان برای متد كلاس مشتق شده پیادهسازی متفاوتی از پیادهسازی متد كلاس پایه ایجاد نمود. این ویژگی در جایی مناسب است كه میخواهید گروهی از اشیاء را به یك آرایه تخصیص دهید و سپس از متد هر یك از آنها را استفاده كنید. این اشیاء الزاما نباید از یك نوع شیء باشند. هرچند اگر این اشیاء بواسطه ارثبری به یكدیگر مرتبت باشند، میتوان آنها را بعنوان انواع ارثبری شده به آرایه اضافه نمود. اگر هر یك از این اشیاء دارای متدی با نام مشترك باشند، آنگاه میتوان هر یك از آنها را جداگانه پیادهسازی و استفاده نمود. در این درس با چگونگی انجام این عمل آشنا میگردید.
متد مجازی (Virtual Method)
usingSystem;
publicclassDrawingObject
{
publicvirtualvoidDraw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
مثال 1-9 كلاس DrawingObject را نشان میدهد. این كلاس میتواند بعنوان كلاسی پایه چهت كلاسهای دیگر در نظر گرفته شود. این كلاس تنها دارای یك متد با نام Draw() میباشد. این متد دارای پیشوند virtual است. وجود كلمه virtual بیان میدارد كه كلاسهای مشتق شده از این كلاس میتوانند، این متد را override نمایید و آنرا به طریقه دلخواه پیادهسازی كنند.
publicclassLine : DrawingObject
{
publicoverridevoidDraw()
{
Console.WriteLine("I'm a Line.");
}
}
publicclassCircle : DrawingObject
{
publicoverridevoidDraw()
{
Console.WriteLine("I'm a Circle.");
}
}
publicclassSquare : DrawingObject
{
publicoverridevoidDraw()
{
Console.WriteLine("I'm a Square.");
}
}
در مثال 2-9، سه كلاس دیده میشود. این كلاسها از كلاس DrawingObject ارثبری میكنند. هر یك از این كلاسها دارای متد Draw() هستند و تمامی آنها دارای پیشوند override میباشند. وجود كلمه كلیدی override قبل از نام متد، این امكان را فراهم مینماید تا كلاس، متد كلاس پایه خود را override كرده و آنرا به طرز دلخواه پیادهسازی نماید. متدهای override شده باید دارای نوع و پارامترهای مشابه متد كلاس پایه باشند.
publicclassDrawDemo
{
publicstaticintMain( )
{
DrawingObject[] dObj = newDrawingObject[4];
dObj[0] = newLine();
dObj[1] = newCircle();
dObj[2] = newSquare();
dObj[3] = newDrawingObject();
foreach(DrawingObject drawObj indObj)
{
drawObj.Draw();
}
return0;
}
}
مثال 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 است.
خلاصه
در این درس با مفهوم كلی چند ریختی آشنا شدید. چند ریختی امكانی است كه مخصوص زبانهای برنامهنویسی شیگرا است و از طریق آن میتوان برای یك متد موجود در كلاس پایه، چندین پیادهسازی متفاوت در كلاسهای مشتق شده داشت.
سلام عزیزم.
این کدی که شما نوشتید و مطلبتون اصلا به Polymorphism ربطی نداره.
Polymorphism رو ساده بخوام بگم:
به معنای ارث بری به صورت گرافی است نه به صورت درخت باینری.