مشخصات مقاله
-
1866
-
0.0
-
14157
-
0
-
1
آموزش چند ریختی در سی شارپ
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
آموزش چند ریختی در سی شارپ
لغت polymorphism به معنای داشتن چند فرم می باشد. در الگوی برنامه نویسی آبجکت محور، polymorphism اغلب به عنوان یک اینترفیس، چند عملکر بیان می شود.
Polymorphism می تواند استاتیک یا پویا باشد. در نوع استاتیک، پاسخ به یک عملکرد در زمان اجرا تعیین می شود، و در نوع پویای آن در زمان اجرا تصمیم گیری می شود.
Static Polymorphism
مکانیزم لینک کردن یک عملکرد به یک آبجکت در طول دوره ی اجرا، اتصال اولیه نامیده می شود، اتصال استاتیک نیز نامیده می شود. C# دو تکنیک برای اجرای static polymorphism ارائه می دهد که عبارتند از
سربارگذاری از حد عملکرد (function overloading)
سربارگذاری اپراتور (operator overloading)
در مورد function overloading در بخش بعدی بحث می کنیم و operator overloading را در فصل بعدی مورد بحث قرار خواهیم داد.
Function Overloading
شما می توانید چند تعریف از نام همان عملکرد در همان حوزه داشته باشید. تعریف عملکرد متناسب با نوع آن و تعداد نشانه ها در لیست نشانه ها باید با یکدیگر متفاوت باشند.
در زیر مثالی را می بینید که همان عملکرد 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) دارای متدهای نظری می باشند که به وسیله ی گروه مشتق اجرا می شوند. گروه های مشتق قابلیت های تخصصی بیشتری دارند.
لطفا به قوانین زیر در مورد گروه های نظری دقت کنید.
شما نمی توانید نمونه ای از گروه نظری ایجاد کنید.
نمی توانید یک متد نظری خارج از گروه نظری داشته باشید.
وقتی که یک گروه sealed اعلام می شود، نمی تواند جانشین شود. گروه های نظری نمی توانند sealed اعلام شوند.
برنامه زیر نمونه ای گروه نظری را توضیح می دهد.
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 (مجازی) استفاده می کنید. عملکردهای مجازی می توانند به طور متفاوت در یک گروه جانشین متفاوت اجرا شوند و فراخوانی برای این عملکردها در زمان اجرا تصمیم گرفته خواهد شد.
Polymorphism پویا توسط گروه های نظری (abstract classes) و عملکردهای مجازی (virtual functions) اجرا می شود.
برنامه ی زیر این مطلب را توضیح می دهد.
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