PDA

View Full Version : سوال: Interface Polymorphism



dr_csharp
یک شنبه 17 شهریور 1387, 09:56 صبح
سلام
من دو کلاس به نام های Car و Motor دارم که اینترفیس IDrivable رو پیاده سازی کردند.اگر کلاس Car دارای یک پراپرتی جدیدبنام Gear باشه نحوه ی دسترسی به اون چجوریه ؟
اینترفیس IDrivable :


interface IDrivable
{
void Start();
void Stop();
void MoveBack();
void MoveForward();
}


کلاس Motor :


class Motor:IDrivable
{
#region IDrivable Members
void IDrivable.Start()
{
Console.WriteLine("Motor Start");
}
void IDrivable.Stop()
{
Console.WriteLine("Car Stop");
}
void IDrivable.MoveBack()
{
Console.WriteLine("Motor Move Backward");
}
void IDrivable.MoveForward()
{
Console.WriteLine("Motor Move Forward");
}
#endregion
}

کلاس Car :


class Car:IDrivable
{
#region IDrivable Members
public void Start()
{
Console.WriteLine("Car Start");
}
public void Stop()
{
Console.WriteLine("Car Start");
}
public void MoveBack()
{
Console.WriteLine("Car Move Backward");
}
public void MoveForward()
{
Console.WriteLine("Car Move Forward");
}
#endregion
private int m_Gear;
public int Gear
{
get
{
return m_Gear;
}
set
{
m_Gear = value;
}
}
}

کلاس Driver :


class Driver
{
public IDrivable Vehicle;
public void Drive()
{
Vehicle.Start();
Vehicle.MoveForward();
Vehicle.MoveBack();
Vehicle.Stop();
}
}


کلاس اصلی جهت استفاده :


Driver driver = new Driver();
driver.Vehicle = new Car();

driver.Drive();


چطور به پراپرتی Gear کلاس Car که در اینترفیس پیاده سازی نشده دسترسی داشته باشم ؟

dr_csharp
یک شنبه 17 شهریور 1387, 16:04 عصر
آیا اصلا اینطوری میشه به عضو Gear از کلاس Car دسترسی داشت یا حتماباید instance جداگانه از کلاس Car بسازیم ؟

Masiha1986
یک شنبه 17 شهریور 1387, 16:53 عصر
با سلام
می تونید type cast انجام بدین. به عنوان مثال:



if (driver.Vehicle.GetType() == typeof(Car))
{
((Car)driver.Vehicle).Gear = 1;
Console.WriteLine(((Car)driver.Vehicle).Gear);
}

mohammad272005
یک شنبه 17 شهریور 1387, 17:11 عصر
با جواب جناب Masiha1986 (http://barnamenevis.org/forum/member.php?u=34727) کاملا موافقم به شرط اینکه یقین کنید که driver.Vehicle یه car هست که این در مثال شما کاملا مشهوده.

dr_csharp
دوشنبه 18 شهریور 1387, 08:14 صبح
با سلام
می تونید type cast انجام بدین. به عنوان مثال:

if (driver.Vehicle.GetType() == typeof(Car))
{
((Car)driver.Vehicle).Gear = 1;
Console.WriteLine(((Car)driver.Vehicle).Gear);
}

آیا ازنظر رعایت اصول شی گرایی اینکار خللی تو سیستم وارد نمیکنه!؟اصلا polymorphism جهت سهولت در کدنویسی و عدم انجام عملیات تکراریه یا تو عملکرد سیستم هم موثره ؟

اَرژنگ
دوشنبه 18 شهریور 1387, 09:59 صبح
چطور به پراپرتی Gear کلاس Car که در اینترفیس پیاده سازی نشده دسترسی داشته باشم ؟
با سلام
شکلی که سوال را پرسیدید اشتباه است.
۱)اینترفیس نیست که پیاده سازی میکند، اینترفیس وجود قابلیتها را تعریف میکند.
۲)استفاده از یک خصوصیت که در اینترفیس تعریف نشده و کست به یک تایپ به خصوص ،خلاف ایده استفاده از اینترفیس است.
۳)سوال درست این است که چرا قابلیت دسترسی به دنده را در اینترفیس تعریف نمیکنید؟

dr_csharp
دوشنبه 18 شهریور 1387, 12:12 عصر
با سلام
سوال درست این است که چرا قابلیت دسترسی به دنده را در اینترفیس تعریف نمیکنید؟
چون ممکنه گاها بین کلاس های موجود بخوایم یکی از کلاسها ویژگی خاصیداشته باشه.مثلا در اینجا از بین Motor و Car و Truck و دیگر وسائط نقلیه موجود تنها Car دارای Gear است.

اَرژنگ
دوشنبه 18 شهریور 1387, 14:23 عصر
چون ممکنه گاها بین کلاس های موجود بخوایم یکی از کلاسها ویژگی خاصیداشته باشه.مثلا در اینجا از بین Motor و Car و Truck و دیگر وسائط نقلیه موجود تنها Car دارای Gear است.
اگر این طور باشد دیگر استفاده از اینترفیس برایه چیه؟ اینکه تمام فواید استفاده از اینترفیس را بباد میده.
یا باید در اینترفیس تعریف بشد و به یک شکل در همه جا استفاده بشه یا اینکه باید به اینکه با چه کلاس بخصوصی استفاده میشه با اینترفیسهایه کلاسی کار کرد.
این شکل قاطی کردنشان مثل این میماند که بگیم نصف خانه را از بتون و بعضی جاهش را از خشت درست میکنیم. که هم از بتون فایده ببیم و هم اینکه تابستان خنک باشد.
یا به یک عبارت دیگر به این میگویند آرکیتکتچر فرانکشتن، یک چیزی غول بیشاخ دم سره کردن.
باید اینکه با کدام آرکیتچر قراره استفاده بشد تصمیم بگیرند.

dr_csharp
سه شنبه 19 شهریور 1387, 08:24 صبح
یه پروژه ای مثل انتخاب واحد دانشگاه و در نظر بگیرید
قراره نام استاد و نام دانشجو و نام درس انتخاب شده هریک در فایلی متنی قرار بگیره و امکان جستجو وجود داشته باشه.
بنظر شما در چه بخشی از این پروژه امکان استفاده از polymorphism وجود داره ؟
راستش چون قبلا توجهی به این تکنیک نداشتم کاربرد polymorphism تو پروژه ها برام گنگه.ممنون میشم دوستان مثالهایی رو که تا بحال کار کردن بیان کنند.