PDA

View Full Version : سوال: ارث بری در سی شارپ



irpersian20
شنبه 03 مرداد 1394, 04:15 صبح
درود
خوب میدونیم که همه کلاس ها به طور پیش فرض از Object ارث بری می کنند.(به صورت ضمنی)
من یک کلاس می سازم با 100 تا فیلد و 500 تا متد.
حال من می تونم این کلاس رو راحت به Object تبدیل کنم!!
من متوجه نمی شوم چطور میشه؟ در دنیای واقعی مثل این میمونه که ما یک پارچ آب رو بریزیم در یک لیوان آب! آیا جا می شود؟ خیر! سر ریز می شود.
حالا عکس این امکان پذیر هست. یعنی باید بشه Object رو به کلاسی تبدیل کرد که 100 تا فیلد داره و 500 تا متد. مثل این بشه که یک لیوان آب رو بریزیم داخل یک پارچ آب!
که در زبان های برنامه نویسی مثل جاوا و سی شارپ نمیشه!!
اصلا در همان بحث کامپیوتری بحث حافظه Object چگونه هست؟

دلتنگ اسمان
شنبه 03 مرداد 1394, 07:34 صبح
با سلام
تا اونجا که من میدونم اون Object اولی (مادر همه اشیاء در net.) بسیار ساده وکم حجم هستش. اما اون کلاس با اون مشخصات رو اگه شما بخواهید به Object تبدیل کنین مطمئنن همون Object ساده و کم حجم نخواهد بود. بلکه Object خواهد بود متناسب با همون کلاس شما. و بالعکس در تبدیل Object به کلاس هم همین قضیه صادق است.
در این بین کار خاصی انجام نمیشود بلکه فقط نوع آن را عوض می کنین.(برای راحتی و استفاده از بعضی آپشن های موجود در اون Type) مثل این که اون کلاس رو بسته بندی میکنین به شکل Object . و دوباره اون رو باز میکنین.
مثال دیگر : شما تصویری از نوع JPG دارین حالا اون رو به GIF و یا PNG تبدیل میکنین . مسلما تغییراتی که رخ میدهد آنقدر فاحش نیست که بگوییم یک تصویر را عوض کرده ایم. بلکه نوع آن را با توجه به کاربرد خودتان تغییر میدهید.

RmeXXXXXXXXX
شنبه 03 مرداد 1394, 12:26 عصر
تبدیل در اینجا به معنی تبدیل بیت به بیت نیست. مثل تبدیل یک فایل mp4 به avi!
توجه شما را به تحقیق در مورد Box و Unboxing جلب میکنم.
وقتی شما شی ای را ایجاد میکنید ساختار متناظر با کلاس های پدر نیز ایجاد میشوند تا بتوانید از متدهای پدر (متغیرهای استاتیک و ...) نیز استفاده کرده. مثلاً وقتی در متدی که override کرده اید کلمه base.SomeMethod() رو مینویسید CLR سراغ کدهایی که در ساختار وراثت هستند میرود. در اصل دو دستور برای فراخوانی یک متد در IL تعبیه شده call و callvirtaul.
حالا که شی ایجاد شد (همراه با ساختار وراثت متناظر) موقع تبدیل از باکس استفاده میشود بدین ترتیب شی درون جعبه ای قرار میگیرد و برچسب روی جعبه از نوع شی به نوع شی مقصد (در اینجا object) تغییر میکند.
این مثال گویای این مطلب است که میشود شی را به کلاس پدر تبدیل کرد ولی نمیتواند شی ای را به نوع کلاس فرزند تبدیل کرد.
این توضیحات برای کلاس هایی که وراثت دارند صادق است.
حال اگر این کلاس ها رابطه وراثت ندارد توجه شما را به تحقیق در مورد کلمات کلیدی implicit و explicit جلب میکنم. بدین ترتیب تبدیل اشیا رو میتونید شخصی سازی نمائید. در اینگونه تبدیل ها دقیقاً تبدیل مورد نظر شما(بیت به بیت و نوع به نوع) انجام میگیرد.

SabaSabouhi
شنبه 03 مرداد 1394, 12:47 عصر
سلام
ضمن تایید نوشته‌های دوست خوبمون RmeXXXXXXX کمی توضیح اضافه می‌کنم.

لازم به تذکر هست که تو این مبحث هیچ چیزی به چیز دیگری «تبدیل» نمی‌شه، بلکه فقط نگرش هست که عوض می‌شه.

مثال پارچ آب کاملاً اشتباه هست، چون پارچ و لیوان آب هیچ‌کدوم از هم ارث نمی‌برن.
بجاش از مثال «اشخاص»، «کارمندان» و «مشتریان» استفاده می‌کنم.
«اشخاص» کلاس پایه و «کارمندان» و «مشتریان» هم کلاس‌هایی هستن که ازش مشتق شدن.
هر کارمندی، شخص هست. همون‌طور که هر مشتری هم یک شخص هست.

فرض کن یه تابعی داریم که قراره برای یک شخص که به عنوان ورودی بهش داده می‌شه یه SMS ارسال کنه.

شما هر جا که با مشتریان سر و کار داری می‌تونی تابع ارسال رو صدا کنی، چون هر مشتری، شخص هم هست.
تو این حالت مشتری به شخص «تبدیل» نمی‌شه، بلکه به صورت ضمنی خودش یک «شخص» هم هست.
پس بدون نیاز به هیچ کار اضافی مانند cast کردن، می‌تونی متغیر مشتری رو به تابعی که ورودیش از نوع شخص
هست بفرستی.

شما مفهوم‌ها رو بلدی، مشکل شما نگرشی هست که به این مفاهیم داری.
فقط باید به این توجه داشته باشی که هیچ نوع تبدیلی انجام نمی‌شه. فقط دیدگاه عوض می‌شه.
یک مرد، یک انسان هست،
یک انسان یک پستاندار هست
یک پستاندار یک موجود زنده هست

پس یک مرد غیر از مرد بودن، انسان هم هست، پستاندار هم هست و موجود زنده هم هست و بسته به این که
در کجا بخواهیم از آن استفاده کنیم می‌تونیم از آن منظر به آن نگاه کنیم.

صبا صبوحی

alireza264
شنبه 03 مرداد 1394, 23:11 عصر
سلام
ذوست گرامی irpersian20 فکر کنم شما مفهوم کلاس ، object ، و ارثبری رو درست متوجه نشدید



خوب میدونیم که همه کلاس ها به طور پیش فرض از Object ارث بری می کنند.(به صورت ضمنی)


خیرکلاس از object ارثبری نمیکنه بلکه object از کلاس ارثبری میکنه

کلاس (Class) در واقع یک الگو و یک قالب کلی برای تعریف کردن اشیاء( object) است. بعبارت دیگر، کلاس ها در واقع موجودیتی ندارند و خود آنها شی (آبجکت - Object) نیستند، بلکه در واقع یک الگو هستند که اشیاء بر اساس آن ساخته می شوند.
شی یا آبجکت (Object) در واقع یک موجودیت است (چیزی که وجود دارد و فقط یک تعریف نیست) که از روی کلاس (الگوی تعریف شده) ساخته می شود و دارای ویژگی های مخصوص به خودش است.

هر شی (Object) از روی یک کلاس ساخته می شود و در واقع نمایانگر یک کلاس است و به زبان دیگر یک نمونه (instance) از یک کلاس است.در واقع شما هنگامی که یک آبجکت را از روی یک کلاس می سازید، در واقع یک نمونه از کلاس را به وجود آورده اید .

بعنوان مثالی آبجکتی بنام TextBox نداریم بلکه TextBox یک کلاسه و نمونه هایی که ما میسازیم آبجکت هستندمانند textbox1 و
textbox2
حالا اگه بخوایم کلاسی بنویسیم که از تکست باکس ارثبری کنه ارثبری رو از texrbox1 نمینویسیم بلکه از کلاس Textbox ارثبری میکنیم
ونکته دیگه اینه که چیزی بنام ارثبری ضمنی نداریم بلکه دسترسی به فیلدها یا متد های یک کلاس میتونه صریح یا ضمنی باشه