مشخصات مقاله
-
1747
-
0.0
-
6013
-
0
-
0
آموزش پلی مورفیسم یا چند شکلی در سی شارپ
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
پلی مورفیسم یا چند شکلی
این درس چند شکلی در C# را بشما می آموزد. اهداف ما در این فصل
بفهمید چند شکلی چیست
یک متد مجازی پیاده نمایید
بر یک متد مجازی سرباره شوید (OverLoad)
استفاده از چند شکلی در یک برنامه
مفهوم اولیه دیگر در برنامه سازی شی گرا چند شکلی است. این ویژگی به شما اجازه می دهد تا متدهای مشتق شده را از طریق یک ارجاع به کلاس پایه هنگام اجرای برنامه احضار کرد. نیاز به واگذاری گروه اشیا برای یک آرایه و سپس احضار هر یک از متدهایش بطور دستی قابل انجام است. ضرورتا نیازی نیست تا نوع شی مشابه هم باشند. به هر حال اگر آنها توسط ارث بری به هم مرتبط شوند می توانید آنها را به صورت نوع به ارث رسیده اضافه نمایید. بنابراین اگر تمام آنها نام متد یکسانی را بگذارند آن متد از هر شی را می توان احضار نمود. این درس نشان میدهد که چطور این کار را انجام دهید.
لیست 1-9 . یک کلاس پایه با متد مجازی
Listing 9-1. A Base Class With a Virtual Method: DrawingObject.cs using System; public class DrawingObject { public virtual void Draw() { Console.WriteLine("I'm just a generic drawing object."); } }
لیست 1-9 کلاس DrawingObject را نشان می دهد. این یک کلاس پایه برای اشیا دیگری است که از آن ارث می برند. در آن متد تکی به نام Draw() هم وجود دارد. متد Draw() یک اصلاح گر مجازی دارد.
اصلاح گر مجازی کلاسهای مشتق شده را که می توانند با این متد سرباره شوند مشخص می سازد. متد Draw() از کلاس DrawingObject یک عمل تنها از چاپ عبارت "I'm just a generic drawing object." را روی کنسول اه انجام می رساند.
لیست 2-9 ؛ کلاسهای مشتق شده به همراه متدهای سرباره
Listing 9-2. Derived Classes With Override Methods: Line.cs, Circle.cs, and 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."); } }
لیست 2-9 سه کلاس را نشان می دهد. این کلاس ها کلاس DrawingObject را به ارث می برند. هر کلاس یک متد Draw() و هر متد draw() هم یک اصلاح گر سرباره (OverLoad) دارد. اصلاح گر سرباره به یک متد اجازه می دهد تا سرباره یک متد مجازی از کلاس پایه اش در زمان اجرا شود. متد های سربارگی می بایستی امضای یکسان، پارامترها و نام مشابه متد کلاس پایه مجازی ای که سرباره می شود داشته باشند.
لیست 3-9.برنامه ای برای پیاده سازی چند شکلی (پلی مورفیسم)
Listing 9-3. Program Implementing Polymorphism: 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; } }
لیست 3-9 برنامه ای را نشان می دهد که از کلاس های تعریف شده در لیست 1-9 . 2-9 تعریف شده اند. این برنامه چند شکلی را نشان می دهد. در متد Main() از کلاس Drawdemo آرایه ای به چشم می خورد که ایجاد می شود. نوع شی در این آرایه کلاس DrawingObject است. آرایه به نام dObj بوده و جوری مقدار دهی شده تا چهار شی از نوع DrawingObject را داشته باشد.سپس آرایه dObj مقدار دهی شده، به خاطر رابطه ارث بری شان با کلاس DrawingObject کلاسهای line؛Circle و Square را می توان به آرایه dObj واگذار نمود. بدون این قابلیت شما مجبور می شدید یک آرایه برای هر نوع درست نمایید. ارث بری به اشیا مشتق شده اجازه می دهد تا مانند کلاس پایه شان عمل کنند تا در میزان کار قابل انجام صرفه جویی شود. بعد از آماده سازی آرایه یک حلقه foreach وجود دارد که به هر عنصر آرایه نگاه می اندازد. در داخل حلقه foreach متد Draw() از درون هر عنصر آرایه dObj احضار می شود. به دلیل چند شکلی، نوع و زمان اجرای هر شی فراخوانده شده است. نوع مراجعه به شی از آرایه dObj یک شی DrawingObject است. این اهمیتی ندارد، زیرا کلاس های مشتق شده سرباره متد draw() مجازی از کلاس DrawingObject می شود. این کار سبب می شود متدهای سرباره Draw() از کلاسهای مشتق شده زمانیکه متد Draw() فراخوانده می شود اجرا شوند و این کار با ارجاع کلاس پایه DrawingObject از آرایه dObj صورت می پذیرد. خروجی مثال بالا به شکل زیر به نظر می رسد.
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
متد Draw() سرباره از هر کلاس مشتق شده همان طور که در برنامه DrawDemo آمده اجرا می شود.
خط آخر یک متد Draw() مجازی از کلاس DrawingObject است و دلیلش این موضوع است که نوع زمان اجرای واقعی از عنصر چهارم آرایه یک شی DrawingObject() بود. کد این کلاس را می توان با دستور خط فرمان زیر کامپایل نمود.
csc DrawDemo.cs DrawingObject.cs Circle.cs Line.cs Square.cs
پس از اجرا، فایل DrawDemo.exe درست خواهد شد که این نام برای اولین فایل خط دستور بالا به عنوان پیش فرض فایل اجرایی انتخاب شده است.