PDA

مشاهده نسخه کامل : مشکل در پیاده سازی Interface



SajjadKhati
01-11-17, 13:21
سلام
چرا در عکس زیر میگه که مقدار بازگشتی ایندکسر درون اینترفیس IList.this[int] رو درست انجام ندادم :

Only the registered members can see the link

ولی در کلاس ControlCollection ، خود مایکروسافت ، همین کار رو کرد؟!

ravegoat
01-11-17, 17:52
با سلام،

سجاد جان؛ بنده دقیقا متوجه نشدم که میخواستی چیکار کنی؟! اگه یک لینک هم از مثال مایکروسافت در مورد ControlCollection می ذاشتی بد نبود چون چیزی پیدا نکردم.

اگر منظورت پیاده سازی همچین چیزی بود:


object IList.this[int index]
{
get
{
return new Control();
}

set { }
}


که بشینیم با هم بحث کنیم. در غیر این صورت لطفا بیش تر مشکل رو توضیح بده.

SajjadKhati
01-11-17, 18:25
ممنون آقا آرمین
ببینید ، در نرم افزار IL.Spy ، در کلاس ControlCollection ، این کد رو موقع پیاده سازی ایندکسر از اینترفیس IList نشون میده :

Only the registered members can see the link

من هم یه کلاس ساختم و همین حالت رو خواستم پیاده سازی کنم ، ولی اروری که در پست اول رو که گذاشتم ، بهم داد
چرا و چجوری میشه مثل چیزی که مایکروسافت در کلاس ControlCollection نوشت رو پیاده سازی کرد؟

ravegoat
01-11-17, 19:27
متوجه شدم.

همیشه 100 درصد نمیشه به خروجی Decompiler ها اعتماد کرد. کلاس ControlCollection از کلاس ArrangedElementCollection ارث بری داره. کلاس ArrangedElementCollection هم براساس IList پیاده شده. حالا اگر نگاهی به پیاده سازی ArrangedElementCollection بندازی متوجه میشی که خبری از public new virtual Control نیست. بلکه در کلاس ControlCollection عملگر [] که در اصل به ArrangedElementCollection بر می گرده، باز تعریف شده.
در نتیجه مطابق مثال در کلاس Test2 نمی تونی مستقیما عملگر رو باز تعریف کنی چون اصلا این عملگر در Interface تعریف نشده (Interface بر خلاف کلاس base یک پیاده سازی محسوب نمیشه بلکه فقط الگویی برای حفظ ساختار کلاس های مشتق شده به شمار میاد.). اما اگر یه کلاس جدید به اسم Test3 تعریف کنی که از کلاس Test2 ارث بری داشته باشه، کدی که زدی بدون خطا خواهد بود. حتی اگر به شکل صریح بیان کنی که Test3 از IList هم مشتق بشه، در این حالت بازم مشکلی پیش نمیاد چون عملا Test3 با ارث بری از Test2 به شکل ضمنی از IList پیروی می کنه.

موفق باشی
آرمین

SajjadKhati
01-11-17, 22:20
ممنون استاد آرمین :11():
پس دلیل اش اینه که در کلاس ArrangedElementCollection ، اون ایندکسر IList رو پیاده سازی کرده
اینم تازه فهمیدم که وقتی در کلاسی ، یه اینترفیس رو پیاده سازی کنیم ، دیگه وقتی در فرزندان اون کلاس دوباره از همون اینترفیس ارث بری کنیم ، لازم به پیاده سازیش نداره