نمایش نتایج 1 تا 6 از 6

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

  1. #1
    کاربر دائمی
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    آستارا-تهران
    پست
    357

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

    کلاس من از کلاس 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 چي کار کنم؟

  2. #2
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313

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

    public new string Text

  3. #3
    کاربر دائمی
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    آستارا-تهران
    پست
    357

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

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

  4. #4
    کاربر دائمی آواتار Sorenaa_s
    تاریخ عضویت
    اردیبهشت 1386
    سن
    43
    پست
    115

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



    new private string Text
    {
    get
    {
    return string.Empty;
    }
    set
    {
    }
    }


  5. #5

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

    میخوای که چی بشه ؟
    تو به هر حال اگر هم در کلاس مشتق شده تونستی این متد/پراپرتی رو مخفی کنی ، به سورس کلاس مادر که دسترسی نداری. کد زیر رو ببین، نهایت کاری که میتونی بکنی اینه:


    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/sh...d.php?t=127436) یه بحثی در مورد فراخوانی سازندۀ دو کلاس بالاتر بحث شده بود که من راهکاری با IL ارائه دادم ، منتها اون به خاطر محدودیت زبان سی شارپ بود (یعنی رانتایم این اجازه رو بهم میداد.) ظاهرا در مورد سوال تو ، اصلا این مفهوم در رانتایم هم وجود نداره و هیچ راهی به نظر نمی رسه. (پچ کردن فایل اجرایی ؟؟؟)
    We work in the dark, we do what we can, we give what we have.
    Our doubt is our passion and our passion is our task.
    The rest is the madness of art

  6. #6
    کاربر دائمی
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    آستارا-تهران
    پست
    357

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

    امروز اتفاقی یه چیز جالب توجه من رو جلب کرد.
    میدونید که کنترل 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;
    }
    }

    پس مایکروسافت به نوعی این کنترل را از دید برنامه نویس مخفی کرده است و من نیز به خواسته خود رسیدم.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •