تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 7 از 7

نام تاپيک: ارث خاص

  1. #1
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    2 ارث خاص

    سلام.

    من مثلاً این رو دارم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ok؟

    حالا این ارور میده.

    کلاس a رو چجوری تعریف کنم که کلاس b بتونه اون رو به ارث ببره ولی بیرون از این namespace کسی نتونه به ارث ببرش؟

  2. #2
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    سلام.

    یکی دیگه!

    این رو ببینید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    می خوام هر کسی بتونه کلاس a من رو به ارث ببره ولی نتونه کلاس b رو به ارث ببره.

    c باید قابلیت override شدن داشته باشه ولی d نه.

    وقتی که طرف d رو از کلاس a صدا می زنه، همونطور که مشخصه باید e از کلاس b صدا زده بشه و (یه سری کار روش انجام بده و) اون هم c رو از کلاس a صدا بزنه.

    هر کس این رو بنویسه جایزه داره.

    راستیتش می خوام یه dll درست کنم که ملت بتونن از یه سری از متد ها و کلاس هاش استفاده کنند (با به ارث بردنش) در حالی که بقیه شون کاملاً داخلی باشن و طرف از وجودشون مطلع نشه.


    ---

    نیما جان اگر دیدی و بلدی، بگو!
    [این یه دفعه رو بپیچون بازی در نیار ]

  3. این کاربر از dogtag بخاطر این مطلب مفید تشکر کرده است


  4. #3
    حـــــرفـه ای M E H D I's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    خونمون
    پست ها
    2,606

    پيش فرض

    سلام.

    من مثلاً این رو دارم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ok؟

    حالا این ارور میده.

    کلاس a رو چجوری تعریف کنم که کلاس b بتونه اون رو به ارث ببره ولی بیرون از این namespace کسی نتونه به ارث ببرش؟
    این به خاطر این هست که کلاس b که از a ارث برده، بیشتر از پدرش دسترسی دارن بهش. یعنی پدرش به خاطر این که هیچ modifier ی نذاشتین براش، به صورت private در نظر گرفته میشه اما b چون public هست، بیشتر از a دسترسی بهش وجود داره. حالا اگه شما می خواین که از ش نشه بیرون از این namespace ارث بری بشه می تونین از دسترسیinternal براش استفاده کنین اما باز هم نمی تونین b رو public تعریف کنین. b هم باید internal، Protected یا private باشه.

    سلام.

    یکی دیگه!

    این رو ببینید:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    می خوام هر کسی بتونه کلاس a من رو به ارث ببره ولی نتونه کلاس b رو به ارث ببره.

    c باید قابلیت override شدن داشته باشه ولی d نه.

    وقتی که طرف d رو از کلاس a صدا می زنه، همونطور که مشخصه باید e از کلاس b صدا زده بشه و (یه سری کار روش انجام بده و) اون هم c رو از کلاس a صدا بزنه.

    هر کس این رو بنویسه جایزه داره.

    راستیتش می خوام یه dll درست کنم که ملت بتونن از یه سری از متد ها و کلاس هاش استفاده کنند (با به ارث بردنش) در حالی که بقیه شون کاملاً داخلی باشن و طرف از وجودشون مطلع نشه.


    ---

    نیما جان اگر دیدی و بلدی، بگو!
    [این یه دفعه رو بپیچون بازی در نیار ]
    خوب یکی یکی از اول:
    کلاس a رو باید public تعریف کنین و کلاس b رو به صورت sealed

    دومی:
    متد c رو باید virtual تعریف کنین و متد d رو به صورت sealed

    سومی:
    این حالت که شما نوشتین برای فراخوانی متدهای غیراستاتیک که نمیشه! یعنی اگه بخواین یه متد رو با اسم کلاس صدا کنین حتما باید اون متد توی کلاس به صورت static تعریف بشه. اگه نخواین static باشن، باید یه نوع از کلاس مثلا a رو new کنین و بعد متدهایی که میخواین دسترسی بهشون داشته باشین رو public تعریف کنین.

    سوال آخر هم که جایزه داره:
    روی solution راست کلیک کنین و برین به properties ش. توی همون قسمت اول که application هست نوشته output type . از اونجا class library رو انتخاب کنین به جای windows application یا console application . همین : دی

    موفق باشین

  5. #4
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    ضمن تایید توضیحات کاربر MEHDI لازم دیدم در جهت کمک بیشتر، کمی توضیح و کدهای مربوطه را هم قرار دهم.

    حتماً میدانید که در دات نت چهار عبارت مشخص کننده محدوده دید داریم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    پیشنهاد میکنم در اول تعریف هر چیزی (class, struc, enum, delegate ... field, property, method ...) صراحتاً حوزه دید را با کلمات کلیدی فوق مشخص کنید.

    در خصوص کلمات کلیدی وراثتی هم اینها را در اختیار دارید:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    طبیعتاً همه سوالات شما با تلفیقی از کلمات کلیدی فوق قابل حل است.

    ==============

    کلاس a رو چجوری تعریف کنم که کلاس b بتونه اون رو به ارث ببره ولی بیرون از این namespace کسی نتونه به ارث ببرش؟
    برای namespace نمیتوانید کاری کنید ولی برای داخل و خارج یک اسمبلی (dll یا exe) میتوان کارهایی کرد.

    اگر بخواهید کلاسهای CA و CB در دسترس عموم و public کنید،
    تنها راهی که میماند آن است که سازنده های کلاس CA شما internal باشند.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    حالا ...
    1- کلاس CA عمومی است.
    2- کلاس CA در خارج از اسمبلی جاری راحت قابل نمونه سازی (new) نخواهد بود.
    (اگر میخواهید به راحتی قابل new باشد، میتواند کلاس با کد خالی CC را اضافه کنید، تا در خارج از اسمبلی جاری CC را new کنند، که طبیعتاً فرقی با new کردن CA ندارد!)

    3- کلاس CA قابل وراثت گیری نخواهد بود. (همان چیزی که خواسته اید)

    4- کلاس CA میتواند abstract باشد که در این صورت در داخل اسمبلی هم قابل نمونه سازی نخواهد بود.

    (پیشنهاد میکنم یکم کدها را اصلاح کنید و اجازه وراثت را بدهید! کی به کی؟!)


    می خوام هر کسی بتونه کلاس a من رو به ارث ببره ولی نتونه کلاس b رو به ارث ببره.
    c باید قابلیت override شدن داشته باشه ولی d نه.
    همانطور که کاربر MEHDI توضیح دادند:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ==============

    وقتی که طرف d رو از کلاس a صدا می زنه، همونطور که مشخصه باید e از کلاس b صدا زده بشه و (یه سری کار روش انجام بده و) اون هم c رو از کلاس a صدا بزنه.
    به نظر میرسد دو کلاس a و b جدید شما با هم رابطه ی وراثتی ندارند، نتیجتاً یا باید متدها static باشند (روشی نچندان شی گرا) و یا اینکه یکی از کلاسهای a و b که زودتر نمونه سازی میشود دیگری را هم نمونه سازی کند.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    سعی کنید تفکر ساده و قدرتمندی داشته باشید.
    موفق باشید.

  6. #5
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    هم با تشکر از جناب M E H D I و همچنین با تشکر ویژه از جناب استاد _H2_.

    جدی عالی یاد می دید ها.

    فقط میشه لطف کنید بگید کلید واژه ها بین #C و VB.net هم معنی هستند.

    مثلاً NotInheritable خب خیلی معلومه ولی sealed چیز خاصی رو نمی رسونه! (+ اگر من رو بکشید با VB نمی نویسم و به جاش #Cش رو هر چند سخت، یاد می گیرم [و می دونم که این اصلاً خوب نیست و باید net. یاد گرفت نه #C])

  7. #6
    حـــــرفـه ای M E H D I's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    خونمون
    پست ها
    2,606

    پيش فرض

    فقط میشه لطف کنید بگید کلید واژه ها بین #C و VB.net هم معنی هستند.

    مثلاً NotInheritable خب خیلی معلومه ولی sealed چیز خاصی رو نمی رسونه! (+ اگر من رو بکشید با VB نمی نویسم و به جاش #Cش رو هر چند سخت، یاد می گیرم [و می دونم که این اصلاً خوب نیست و باید net. یاد گرفت نه #C])
    sealed فقط به معنی NotInheritable نیست. sealed اگه برای کلاس باشه به معنی این هست که کلاس رو نمیشه ارث بری کرد اما اگه برای متد یا property استفاده بشه به این معنی هست که override فعلی آخرین override از متد هست یعنی دیگه نمیشه این متد رو override کرد. توی این حالت حتما باید به همراه کلمه کلیدی override استفاده بشه. برای struct ها هم نمیشه از sealed استفاده کرد چون به صورت ضمنی همه ساختارها sealed هستن که VB برای این حالت NotOverridable رو استفاده میکنه.

    من VB رو زیاد کار نکردم باهاش. MustInherit فکر کنم میشه همون abstract
    MustOverride هم فکر کنم همون abstract باشه وقتی روی متد استفاده بشه. Shadows هم فکر کنم یه چیزی تو مایه های new باشه برای متد ( درسته؟ )

  8. این کاربر از M E H D I بخاطر این مطلب مفید تشکر کرده است


  9. #7
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    توضیحات کاربر MEHDI صحیح بودند و گفتم یک توضیح مختصر اضافه کنم ...
    کلمات وراثتی VB.Net برای class و property+method تفاوت دارد ولی در C#.Net چنین نیست.
    (البته در موارد دیگر چیزهای برعکس هم داریم که #C چند کلمه دارد و VB یک کلمه)

    ... این کلمات کلیدی C#.Net در واقع از ++C آماده اند.

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    البته کلمات کلیدی Shadows و Overloads و new (نه آن new نمونه سازی !) هم وجود دارند که خیلی به مفاهیم فوق نزدیک هستند ولی من نمیتوانم آنها را جزء گروه کلمات کلیدی مرتبط با وراثت و پلیمورفیزم طبقه بندی کنم.

    جمیعاً موفق باشید.
    Last edited by _H2_; 30-03-2009 at 01:31.

  10. 3 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

برچسب های این موضوع

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •