PDA

View Full Version : متد پنهان ، ارجاع به کلاس پایه در کلاس مشتق شده



wolf_majid
شنبه 11 خرداد 1392, 11:46 صبح
سلام دوستان
اگر در کلاس فرزندی متدی همنام کلاس والد داشته باشیم با امضای یکسان , متد کلاس پدر در نظر گرفته نمیشه
سوال من اینجاست که :
1- مطمئنا" متد کلاس فرزند اجرا میشه دیگه ؟
2- کامپایلر پیشنهاد میکنه که متد کلاس فرزند دارای کلمه کلیدی new باشه , اگر به پیشنهاد عمل کنیم چه تغییری ایجاد میشه ؟

gwbasic
شنبه 11 خرداد 1392, 11:56 صبح
به دو روش متد کلاس پدر را در کلاس فرزند بازنویسی می کنیم
1- hiding که در این حالت متد را در کلاس فرزند با new باز نویسی می کنیم (که البته اگر از new استفاده نکنیم مشکلی پیش نمی آید و کامپایلر فقط warning می دهد)
2- استفاده از Virtual, Override که در این حالت متد کلاس پدر را virtual تعریف می کنیم و متد کلاس فرزند را override
در این دو حالت متد کلاس فرزند استفاده می شود اما یک نکته دارد اگه کلاس فرزند را به کلاس پدر cast کنیم و سپس متد مورد نظر رو فراخوانی کنیم در حالت اول یعنی روش hiding متد کلاس پدر و در حالت دوم متد کلاس فرزند اجرا می شود

پیشنهاد می کنم فایل pdf آموزش سی شارپی که در این سایت گذاشتم رو در این زمینه مطالعه کنید

wolf_majid
شنبه 11 خرداد 1392, 12:02 عصر
منظورتون این لینکه دیگه ؟
لینک (http://barnamenevis.org/showthread.php?208537-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE)
تازه دیدمش :لبخندساده:

jeson_park
یک شنبه 10 فروردین 1393, 08:56 صبح
سلام
اگر ما ارجاعی به کلاس مشتق شده داشته باشیم می تونیم با عملگر cast () به قسمت پایه کلاس مشتق شده دسترسی داشته باشیم
به کد زیر نگاه کنید


public class BaseClass
{

public void Print()
{
Console.WriteLine("You Are in " + this.GetType().Name.ToString());

}
}
public class DrivedClass : BaseClass
{
public new void Print()
{
Console.WriteLine("you are in " + this.GetType().Name.ToString());

}
}

class Program
{
static void Main(string[] args)
{
BaseClass mClass = new BaseClass();
mClass.Print();

DrivedClass nClass = new DrivedClass();
nClass.Print();

DrivedClass dClass = new DrivedClass();
BaseClass bClass = (BaseClass)dClass;
bClass.Print();

Console.Read();
}
}

در کد بالا با استفاده از BaseClass bClass = (BaseClass)dClass; ما به قسمت پایه کلاس dClass دسترسی پیدا می کنیم
اما چه نیازی به این کار هست؟؟
ممنون می شم دوستان توضیح بدن

tooraj_azizi_1035
یک شنبه 10 فروردین 1393, 19:56 عصر
سلام
این تبدیل رو انجام دادیم تا بتونیم متد Print در کلاس پایه را صدا بزنیم. شما با کلمه کلیدی new متد Print در کلاس پایه را مخفی کردید و فقط در این حالت قابل دسترس میشود.
البته وقتی از virtual به همراه override به جای new استفاده میشه حتی با تبدیل هم متد جدید صدا زده میشه:

public class BaseClass
{
public virtual void DoWork() { }
public virtual int WorkProperty
{
get { return 0; }
}
}
public class DerivedClass : BaseClass
{
public override void DoWork() { }
public override int WorkProperty
{
get { return 0; }
}
}



DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork(); // Also calls the new method.


بیشتر: http://msdn.microsoft.com/en-us/library/ms173152%28v=VS.80%29.aspx

jeson_park
یک شنبه 10 فروردین 1393, 23:25 عصر
چرا ما نمی تونیم بنویسیم
BaseClass bClass = BaseClass();
bClass.Print()
؟؟؟
فکر کنم من این new رو درست متوجه نشدم
چیزی که من برداشت می کنم از new اینه که مثلاً متد کلاس A رو اگه در کلاس B به صورت new تعریف کنیم فقط در کلاس B تغییر می کنه اما این جوری که شما می گی به new کردن در کلاس B
متد کلاس A هم تغییر می کنه :متفکر: