PDA

View Full Version : سوال: سوالی در رابطه با شی گرایی در سی شارپ



FaridAghili
چهارشنبه 28 فروردین 1392, 20:09 عصر
سلام دوستان، قبل از هر چیز ممنون که وقت می ذارید.

اجازه بدید سوالم رو شرح بدم.

برای مثال من کلاسی به اسم Rect و کلاسی به اسم Square دارم که کلاس Square والد کلاس Rect هست.

به این صورت:

class Square
{
public Square()
{
}

public void Show()
{
MessageBox.Show("Square");
}
}

class Rect : Square
{
public Rect()
{
}

public void Show()
{
MessageBox.Show("Rect");
}
}


* در هر 2 کلاس، متدی به نام Show وجود داره که نام کلاس رو نمایش میده.

برای ساخت و استفاده از این 2 کلاس به شکل زیر عمل می کنم:

Square s = new Square();
s.Show(); //Output: Square

Rect r = new Rect();
r.Show(); //Output: Rect


همه چیز کاملا خوب پیش می ره تا زمانی که... به سرم می زنه و یه همچین کاری می کنم!

Square x = new Rect();
x.Show(); //Output: Square


همونطور که به صورت کامنت مشخص کردم، خروجی متد Show از متغیر x برابر با Square هست :| سوالی که پیش می یاد اینه که چرا متد Show از کلاس Square فراخوانی می شه و نه از کلاس Rect.
درسته که نوع داده ای x از نوع Square هست اما محتویات اون از نوع Rect هست.

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

سپاس، فرید.

tooraj_azizi_1035
چهارشنبه 28 فروردین 1392, 20:27 عصر
سلام
شما در خط پایین متغیری از نوع Square تعریف کردید و نمونه ای از روی Rect ساخته و به آن نسبت دادید با این کار x به اعضای Rect به علاوه اعضایی از Square که در Rect نیستند و همزمان در Square اجازه دسترسی به آنها داده شده دسترسی خواهد داشت:
Square x = new Rect();

و متد Show() اصطلاحاً متد همنام خود در کلاس پدر را Hide کرده است:http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

gwbasic
چهارشنبه 28 فروردین 1392, 23:38 عصر
وقتی شما x رو از نوع Square تعریف کردین و به یک شی از Rect نسبت دادین یعنی در اصل از زاویه دید Square‌ به Rect‌ نگاه می کنین بنابراین شی شما Rect‌ هست ولی شما فقط به اعضایی که در Square‌تعریف شده دسترسی دارین. اعضایی که در Rect‌تعریف شده و در Square‌ موجود نیست از دید شما پنهان خواهد بود. اما نکته بعدی اینکه اگر متدی در کلاس پدر را در کلاس فرزند بازنویسی کردین چه می شود و کدام کد اجرا می شود پدر یا فرزند؟
برای پاسخ دقت کنید که بازنویسی یک عضو در کلاس فرزند از دو راه امکان پذیر است.
1- این روشی که شما استفاده کردین یعنی Hiding : در این حالت متد پدر یعنی Square صدا زده می شود
2- با استفاده از Virtual و orverride : که در این حالت متد فرزند صدا زده خواهد شد یعنی Rect

برای توضیحات بیشتر به pdf آموزش سی شارپ من که در این سایت موجود هست مراجعه کنید

FaridAghili
پنج شنبه 29 فروردین 1392, 17:47 عصر
سپاس از وقتی که گذاشتید، متشکر از همه.

فرید.

FaridAghili
پنج شنبه 29 فروردین 1392, 20:32 عصر
دوستان، آیا این موضوعی که عرض کردم و توضیحاتی که لطف کردید همون چندریختی هست؟