PDA

View Full Version : سوال: چه جوري تو ارث بري ميشه يک خاصيت کلاس پايه رو از بين برد



mohsen_csharp
شنبه 19 بهمن 1387, 10:34 صبح
کلاس من از کلاس comboBox ارث بري کرده است من مي خوام خاصيت Text اونو از بين ببرم چه جوري؟

اگه اين جوري تعريف کنم


private string Text
{
get { return "nothing";}
}

خاصيت Text کلاس پايه رو همچنان به ارث مي بره و از بيرون قابل دسترسه و يه warning هم ميده
To make the current method override that implementation, add the override keyword. Otherwise add the new keyword.

اينجوري:


public string Text
{
get { return "nothing";}
}

همين خاصيت به وجود مياد که من مي خوام نباشه

اينجوري:


public new string Text
{
get { return "nothing";}
}

همين خاصيت به وجود مياد که من مي خوام نباشه

اينجوري:


public override string Text
{
get { return "nothing";}
}

همين خاصيت به وجود مياد که من مي خوام نباشه

اينجوري:


private new string Text
{
get { return "nothing";}
}

خاصيت Text کلاس پايه رو همچنان به ارث مي بره و از بيرون قابل دسترسه.

اينجوري:


private override string Text
{
get { return "nothing";}
}

اين ارور را مي گيرد virtual or abstract members cannot be private

پس براي از بين بردن يا لااقل مخفي کردن خاصيت Text چي کار کنم؟

linux
شنبه 19 بهمن 1387, 13:10 عصر
public new string Text

mohsen_csharp
شنبه 19 بهمن 1387, 20:31 عصر
من که اینو توضیح دادم
خاصيت Text کلاس پايه رو همچنان به ارث مي بره و از بيرون قابل دسترسه.

Sorenaa_s
شنبه 19 بهمن 1387, 23:27 عصر
new private string Text
{
get
{
return string.Empty;
}
set
{
}
}

Mehdi Asgari
یک شنبه 20 بهمن 1387, 01:20 صبح
میخوای که چی بشه ؟
تو به هر حال اگر هم در کلاس مشتق شده تونستی این متد/پراپرتی رو مخفی کنی ، به سورس کلاس مادر که دسترسی نداری. کد زیر رو ببین، نهایت کاری که میتونی بکنی اینه:




class Base
{
virtual public void Text()
{
Console.WriteLine("In Base");
}
}

class Derived : Base
{
private new void Text()
{
Console.WriteLine("In Derived");
}
}

class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
d.Text();//In Base
}
}


ما متد مورد نظر رو new و private کردیم اما همچنان به متد کلاس بالاتر دسترسی داریم. تو نمی تونی در مورد متدی که برای کلاس مادره و داری از اون کلاس به ارث می بری ، انتخابی عمل کنی و بگی چی رو میخوای و چی رو نمیخوای.
یه سری چیزا by design همینطور هستن که می بینی. زبان هایی مثل سی شارپ با این هدف تعریف شدن که "یه سری" کارا رو نتونی انجام بدی (به نفع خودته). چرا میخوای این کارو بکنی. تا جایی که سواد کم من قد میده همچین چیزی ممکن نیست (و کاربردی هم نداره)
من سعی کردم با دستکاری در کد IL به جاهایی برسم ولی نشد. یعنی با این که کد مربوط به متد مربوطه در کلاس فرزند رو پاک کردم ولی باز هم به خاطر این که در تعریف کلاس فرزند اومده:

class public auto ansi beforefieldinit ClassLibrary1.Derived
extends ClassLibrary1.Base
نمی تونیم کاری کنیم که این متد دیده نشه. (البته در اصل هم دیده نمیشه!. چون وقتی intellisense ویژوال استودیو اعضای شی فرزند رو لیست می کنه در کنار نام Text می نویسه: void Base.Text
و این یعنی متد کلاس فرزند پنهان شده و ما داریم متد کلاس بالاتر رو می بینیم)
پ ن: قبلا در (http://www.barnamenevis.org/forum/showthread.php?t=127436) یه بحثی در مورد فراخوانی سازندۀ دو کلاس بالاتر بحث شده بود که من راهکاری با IL ارائه دادم ، منتها اون به خاطر محدودیت زبان سی شارپ بود (یعنی رانتایم این اجازه رو بهم میداد.) ظاهرا در مورد سوال تو ، اصلا این مفهوم در رانتایم هم وجود نداره و هیچ راهی به نظر نمی رسه. (پچ کردن فایل اجرایی ؟؟؟)

mohsen_csharp
پنج شنبه 20 فروردین 1388, 18:20 عصر
امروز اتفاقی یه چیز جالب توجه من رو جلب کرد.
میدونید که کنترل DataGridView خاصیت BackColor نداره و به جاش خاصیت BackgroundColor داره ولی اگه شما خاصیت BackColor را به کار ببرید ، برنامه به درستی کامپایل میشه.!!!(به نظر شما چرا؟)
می دانیم که DataGridView از کلاس Control به ارث برده شده و چون کلاس Control دارای خاصیت BackColor می باشد پس به اجبار DataGridView نیز این خاصیت را خواهد داشت پس چگونه این خاصیت از دید برنامه نویس مخفی شده است.
با بررسی توسط Reflector به این نتیجه رسیدم

[Browsable(false), DesignerSerializationVisibility(DesignerSerializat ionVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
}
}
پس مایکروسافت به نوعی این کنترل را از دید برنامه نویس مخفی کرده است و من نیز به خواسته خود رسیدم.