PDA

View Full Version : وراثت و تحریف متد



hamid206
سه شنبه 09 مرداد 1386, 21:01 عصر
من یک کلاس پایه دارم که توش یه متد به نام name وجود داره حالا یک کلاس دیگه ایجاد می کنم که وارث این کلاس هست حالا می خوام متد عمومی name رو که از کلاس پایه به ارث بردم تغییر بدم من این کار رو می تونم به سه روش انجام بدم به شکل زیر و در عمل هم نتایج عملکرد هر سه تای اونها به ظاهر یکسان هست تفاوت این سه روش در چیه؟


Public void name()



Public new void name()



Public override void name()


در ضمن یادم رفت بگم name در کلاس پایه بصورت virtual هست
...

PC2st
سه شنبه 09 مرداد 1386, 22:48 عصر
تفاوتها (در صورتی که عضو name بصورت virtual هست)
در حالت اول که چون به صورت صریح مشخص نکردیم که متد کلاس پدر رو میخوایم hide کنیم یا میخوایم اون رو override کنیم، پس یک warning بوجود میآد و زیر نام متد سبز رنگ میشه که بهرحال در اینصورت بصورت پیش فرض، متد کلاس پدر بصورت hide شده در نظر گرفته میشه.
در حالت دوم، صریحا مشخص میکنیم که میخوایم متد کلاس پدر رو hide کنیم.
در حالت سوم، صریحا متد کلاس پدر (متد name) رو override میکنیم.
حالت اول که مشخص شد... (یعنی بصورت صریح مشخص نکرده بودیم که میخوایم چیکار کنیم و اگر کامپایلر سی# رو سخت گیر کرده باشیم، آنوقت در صورت بکار بردن حالت اول، برنامه کامپایل نخواهد شد!)
فرق حالت دوم و سوم تحت یک مثال:


class A
{
public virtual void name()
{
Console.WriteLine("FROM A");
}
}

class B : A
{
public new void name()
{
Console.WriteLine("FROM B");
}
}

class C : B
{
public override void name()
{
Console.WriteLine("FROM C");
}
}

که در مثال فوق از حالت دوم برای کلاس B استفاده کردیم که در اینصورت نمیشه متد name از کلاس C رو بصورت override تعریف کرد و کد فوق کامپایل نخواهد شد.

Sajjad1364
چهارشنبه 10 مرداد 1386, 14:55 عصر
البته حالت دیگری هم وجود دارد که سلسله مراتب وراثتی را از نو ایجاد میکند.



public new virtual void name()
{
Console.WriteLine("FROM A");
}


این حالت ,حالت خاص و جالبیست که هر زبان برنامه نویسی شئ گرایی (مثلا C++)این توانایی را ندارد