PDA

View Full Version : سوال: کلمه کلیدی new در property کلاس مشتق شده هنگامی که کلاس پدر virtual یا abstract نداشته باشد



OmMiD_MtWo
سه شنبه 23 آذر 1395, 13:04 عصر
سلام
کلمه کلیدی new در تعریف یک propertty در کلاس مشتق شده هنگامی که همان property در کلاس پدر virtual یا abstract نباشد، نقش همان نقش override را بازی میکند؟

باتشکر

Mahmoud.Afrad
سه شنبه 23 آذر 1395, 16:07 عصر
نه، متفاوت هستند.
تفاوت این دو کلمه کلیدی در هنگام استفاده از اشیائی که از روی کلاسها ساخته میشود مشخص می گردد.

فرض کنید کلاس A کلاس پایه و کلاس B کلاس مشتق شده از کلاس پایه هستند.
اگر عضوی(شامل فیلدها، پراپرتی ها و متدها و کلاسهای درونی) در کلاس A با کلمه کلیدی abstract معرفی شود، شما را ملزم به پیاده سازی آن عضو (توسط کلمه کلیدی override) در کلاس B میکند.
اگر عضوی از کلاس A با کلمه کلیدی Virtual معرفی شود، شما مختار هستید آن عضو را در کلاس B مجددا پیاده سازی کنید.
اگر عضوی از کلاس B با کلمه کلیدی new معرفی شود، آن عضو باعث میشود عضو موجود در کلاس پایه مخفی شود.

اما تفاوت new و override زمانی خود را نشان میدهد که بخواهید از طریق نمونه های ایجاد شده از این کلاس ها به اجزای کلاسها دسترسی پیدا کنید.
فرض کنید شئ a را از کلاس A و شئ b زا از کلاس B ایجاد کرده اید. در اینصورت میتوانید به اجزای هر کدام از این نمونه ها دسترسی داشته باشید.
اما آیا میتوانید از طریق شئ b مثلا متدی از کلاس پایه(A) را فراخوانی کنید یا نه؟
اگر متد را در کلاس مشتق شده override کرده باشید، نمی توانید همان متد را از کلاس پایه فراخوانی کنید.(bCastToA.Method1(); در مثال زیر)
اگر متد را در کلاس مشتق شده new کرده باشید ، می توانید همان متد در کلاس پایه را فراخوانی کنید.(bCastToA.Method2(); در مثال زیر)
(دو جمله بالا با این فرض است که شئ b را به کلاس پایه cast کنیم (bCastToA در مثال زیر))
public class A
{
public virtual void Method1()
{
MessageBox.Show("Method1 Called from class A");
}

public void Method2()
{
MessageBox.Show("Method2 Called from class A");
}
}

public class B : A
{
public override void Method1()
{
MessageBox.Show("Method1 Called from class B");
}

public new void Method2()
{
MessageBox.Show("Method2 Called from class B");
}
}
اجرا
A a = new A();
B b = new B();
A bCastToA = b as A; // cast b to base class

a.Method1(); // Calls implementation in A
a.Method2(); // Calls implementation in A
b.Method1(); // Calls implementation in B
b.Method2(); // Calls implementation in B
bCastToA.Method1(); // Calls implementation in B
bCastToA.Method2(); // Calls implementation in A

OmMiD_MtWo
چهارشنبه 24 آذر 1395, 08:37 صبح
مممنون از توضیحاتتون
فقط اینکه منظورتون از مخفی شدن این هست که به طور عادی وقتی که متد2 از کلاس b رو فراخونی کنیم، متد2 از کلاس B اجرا میشه ولی وقتی که b رو در قالب a در بیاریم ، متد2 از کلاس a اجرا میشه؟ یه ذره معنی مخفی شدن گنگ هست واسم :متفکر:

Mahmoud.Afrad
چهارشنبه 24 آذر 1395, 15:40 عصر
بله. همینی هست که گفتید. در مورد مخفی شدن هم چیزی هست که در لینک زیر میتونید متن اصلی رو بخونید
https://msdn.microsoft.com/en-us/library/435f1dw2.aspx