چند ریختی (Polymorphism) در زبان سی شارپ
کلمه Polymorphism به معنای داشتن چندین شکل است. در برنامه نویسی شیء گرا، اغلب به عنوان یک اینترفیس و چندین تابع (one interface, multiple functions) بیان می شود. چند ریختی (Polymorphism) در زبان سی شارپ می تواند به صورت استاتیک و پویا باشد. در چند ریختی استاتیک، وضعیت یک تابع در زمان کامپایل مشخص می شود، ولی در نوع پویا، وضعیت یک تابع در زمان اجرا مشخص می شود.
چند ریختی استاتیک
به مکانیزم پیوند یک تابع با یک شیء در زمان کامپایل، اتصال اولیه یا اتصال استاتیک گفته می شود. در زبان برنامه نویسی C# به منظور پیاده سازی چند ریختی استاتیک دو تکنیک ارائه می شود که عبارت اند از:
- Function overloading
- Operator overloading
در مورد Operator overloading در بخش بعدی بحث خواهیم کرد.
Function Overloading در زبان C#
شما می توانید برای یک تابع پیاده سازی های متفاوتی در همان محدوده ای که تعریف شده است، انجام دهید. این پیاده سازی ها همگی یک نام دارند اما تعداد و نوع آرگومان هر کدام از آن ها متفاوت است. نوع بازگشتی یک تابع نمی تواند برای تعریف overload استفاده شود.
برای نمونه در مثال زیر ما سه تابع هم نام به نام print داریم. آرگومانی که تابع print در هر کدام از پیاده سازی ها میگیرد، متفاوت با دیگری است:
using System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine("Printing int: {0}", i ); } void print(double f) { Console.WriteLine("Printing float: {0}" , f); } void print(string s) { Console.WriteLine("Printing string: {0}", s); } static void Main(string[] args) { Printdata p = new Printdata(); // Call print to print integer p.print(5); // Call print to print float p.print(500.263); // Call print to print string p.print("Hello C++"); Console.ReadKey(); } } }
امتحان کنید
زمانی که کد بالا توسط کامپایلر زبان سی شارپ اجرا شود، نتیجه زیر را تولید خواهد کرد:
Printing int: 5 Printing float: 500.263 Printing string: Hello C++
چند ریختی پویا
در زبان برنامه نویسی C# شما می توانید کلاس های abstract ایجاد کنید که به منظور فراهم کردن پیاده سازی یک کلاس partial از یک اینترفیس استفاده می شود. کلاس های abstract شامل متدهای abstract هستند که توسط کلاس مشتق شده، پیاده سازی می شوند.
در زیر قوانین مربوط به کلاس های abstract را مشاهده می کنید:
- امکان نمونه سازی از یک کلاس abstract وجود دارد.
- نمی توان در داخل کلاسی که به صورت abstract نیست، متد abstract تعریف کرد.
- زمانی که یک کلاس به صورت sealed تعریف می شود، نمی توان از آن ارث بری کرد. بنابراین کلاس های abstract نمی توانند به صورت sealed تعریف شوند.
مثال زیر یک کلاس abstract را نشان می دهد:
using System; namespace PolymorphismApplication { abstract class Shape { public abstract int area(); } class Rectangle: Shape { private int length; private int width; public Rectangle( int a = 0, int b = 0) { length = a; width = b; } public override int area () { Console.WriteLine("Rectangle class area :"); return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(10, 7); double a = r.area(); Console.WriteLine("Area: {0}",a); Console.ReadKey(); } } }
امتحان کنید
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
Rectangle class area : Area: 70
زمانی که بخواهید رفتار یک تابع تعریف شده در کلاس پدر را در کلاس فرزند تغییر دهید، باید آن را به صورت virtual یا مجازی تعریف کنید. توابع virtual می توانند در کلاس های مختلف، پیاده سازی های مختلفی داشته باشند. چند ریختی پویا با استفاده از کلاس های abstract و توابع virtual پیاده سازی می شود.
مثال زیر این موضوع را نشان می دهد:
using System; namespace PolymorphismApplication { class Shape { protected int width, height; public Shape( int a = 0, int b = 0) { width = a; height = b; } public virtual int area() { Console.WriteLine("Parent class area :"); return 0; } } class Rectangle: Shape { public Rectangle( int a = 0, int b = 0): base(a, b) { } public override int area () { Console.WriteLine("Rectangle class area :"); return (width * height); } } class Triangle: Shape { public Triangle(int a = 0, int b = 0): base(a, b) { } public override int area() { Console.WriteLine("Triangle class area :"); return (width * height / 2); } } class Caller { public void CallArea(Shape sh) { int a; a = sh.area(); Console.WriteLine("Area: {0}", a); } } class Tester { static void Main(string[] args) { Caller c = new Caller(); Rectangle r = new Rectangle(10, 7); Triangle t = new Triangle(10, 5); c.CallArea(r); c.CallArea(t); Console.ReadKey(); } } }
امتحان کنید
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
Rectangle class area: Area: 70 Triangle class area: Area: 25
نوشته چند ریختی (Polymorphism) در زبان سی شارپ – آموزش زبان سی شارپ اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.