خب گفتیم که به لطف پلی مرفیسم میشود یک عمل خاص را برای چند کلاس هم خانواده بصورت عمومی نوشت، به جای اینکه این عمل را برای تک تک این کلاسها جداگانه بنویسیم.
حالا مثال رو کامل میکنیم و کلاس مستطیل (Rectangle) رو اضافه میکنیم
class Rectangle : IShape
{
private double _width;
public double Width
{
get { return _width;}
set { _width = value;}
}
private double _height;
public double Height
{
get { return _height;}
set { _height = value;}
}
public string Name
{
get { return "Rectangle"; }
}
public double GetArea()
{
return this._width * this._height;
}
public double GetPerimeter()
{
return (this._width + this._height) * 2;
}
}
خب پس دو کلاس Circle و Rectangle رو نوشتیم و اینترفیس IShape رو اصطلاحاً در آنها implement کردیم. حالا این دو کلاس 2 متد و یک پروپرتی یکسان دارند ولی با بدنه متفاوت و پیاده سازیهای مختلف.
interface polymorphism چه شد؟
خب حالا یک مساله: میخواهیم متدی بنویسیم که در ورودی یک شکل هندسی بگیرد و مشخصات آن را چاپ کند. بدون استفاده از اینترفیس مجبوریم برای هر شکل یک متد مجزا بنویسیم.
private void DisplayCircleInfo(Circle c)
{
Console.WriteLine("Shape Name: " + c.Name);
Console.WriteLine("Shape Area: " + c.GetArea());
Console.WriteLine("Shape Perimeter: " + c.GetPerimeter());
}
private void DisplayRectangleInfo(Rectangle r)
{
Console.WriteLine("Shape Name: " + r.Name);
Console.WriteLine("Shape Area: " + r.GetArea());
Console.WriteLine("Shape Perimeter: " + r.GetPerimeter());
}
وقتی اینترفیس نداریم از روش بالا استفاده میکنیم. اما از طریق اینترفیس میتوان کد بالا را یکی کرد!
private void DisplayInfo(IShape shape)
{
Console.WriteLine("Shape Name: " + shape.Name);
Console.WriteLine("Shape Area: " + shape.GetArea());
Console.WriteLine("Shape Perimeter: " + shape.GetPerimeter());
}
مگر میشود هم شیء Circle و هم شیء Rectangle به این متد پاس کرد؟ بله! چون هم Circle و هم Rectangle خود نوعی IShape هستند و در تعریف کلاسها با عملگر : این اینترفیس را پیاده سازی کردیم. بنابراین با این متد میتوان اطلاعات هر شیئی را که از اینترفیس IShape پشتیبانی میکند چاپ کرد.
Circle c = new Circle();
c.Radius = 3;
DisplayInfo(c);
Rectangle r = new Rectangle();
r.Width = 5;
r.Height = 4;
DisplayInfo(r);
بنابراین تا اینجا ما از کد خود فاکتور گیری کردیم و برای چاپ از یک متد استفاده کردیم. اما کجای کد ما پلی مرفیک است؟ کدام شیء رفتار متفاوت دارد؟ در متد آخر (DisplayInfo) شیء shape دارای رفتارهای متفاوت است! چون اگر Circle باشد یک تکه کد از کلاس Circle اجرا میشود و اگر Rectangle باشد یک تکه کد دیگر از کلاس Rectangle!!! (میتوان با گذاشتن break point و trace برنامه به این موضوع پی برد)
منبع:
DotNetSource.Com
با تشکر از
حمید قادری