PDA

View Full Version : سوال: چرا ميكروسافت امكان shadowing رو ايجاد كرد؟



odiseh
چهارشنبه 04 دی 1387, 19:45 عصر
سلام
من تا حالا چندين مقاله راجع به shadowing توي دات نت خوندم ولي راستش قانع نشدم كه چرا اين امكان بايد يه نياز باشه؟

خواهشا تعاريف ساده و تئوري رو پيش نكشين كه دلخور ميشم. اگه واقعا توي كدهاتون ازش استفاده كردين و نيازش رو حس كردين منو هم راهنمايي كنيد.

nasser.man
جمعه 06 دی 1387, 13:49 عصر
می تونین توضیحات بیشتری در باره ی اون بدین تا کسایی مثل من هم مطالبی یادبگیرن ...:لبخندساده:

Armin060
جمعه 06 دی 1387, 17:48 عصر
Shadow برای چی؟

Chabok
جمعه 06 دی 1387, 19:59 عصر
بحث Shadowing در شی گرایی خیلی شبیه به Overriding است .
با این تفاوت که واقعا ویژگی یا متد به ارث رسیده را نابود نمی کند .
بلکه مقادیر شی پدر نیز حفظ خواهد شد و میتوان به آن دسترسی داشت .

مثال :
Accessing parent members when using Shadows (http://www.aspfree.com/c/a/VB.NET/Shadowing-using-Shadows-in-Visual-Basic-NET-2005/1/)

شاید در کدها مون کمتر ازش استفاده کنیم . ولی دلیل ایجادش همین کاری است که انجام میده .

odiseh
شنبه 07 دی 1387, 10:30 صبح
بحث Shadowing در شی گرایی خیلی شبیه به Overriding است .
با این تفاوت که واقعا ویژگی یا متد به ارث رسیده را نابود نمی کند .
بلکه مقادیر شی پدر نیز حفظ خواهد شد و میتوان به آن دسترسی داشت .

مثال :
Accessing parent members when using Shadows (http://www.aspfree.com/c/a/VB.NET/Shadowing-using-Shadows-in-Visual-Basic-NET-2005/1/)

شاید در کدها مون کمتر ازش استفاده کنیم . ولی دلیل ایجادش همین کاری است که انجام میده .
سلام
مرسی از بابت توضیحت و آدرسی که داده بودی. شما می دونی که از نظر تخصیص حافظه و آدرس دهی در Stack و Heap ، خط زیر به چه صورتی هستش؟

Dim RefParent as Parent = new Child

odiseh
شنبه 07 دی 1387, 10:50 صبح
و در ادامه پست قبلی ، اصلا
Dim RefParent As Parent = New Child با
Dim P As New Parent
با توجه به آدرس سایتی که شما داده بودی چه فرقی می کنه؟

Chabok
شنبه 07 دی 1387, 11:28 صبح
سلام .

شما می دونی که از نظر تخصیص حافظه و آدرس دهی در Stack و Heap ، خط زیر به چه صورتی هستش؟


Dim RefParent as Parent = new Child

نه متاسفانه .


و در ادامه پست قبلی ، اصلا
Dim RefParent As Parent = New Child با
Dim P As New Parent با توجه به آدرس سایتی که شما داده بودی چه فرقی می کنه؟

چیزی که شما در ظاهر میبینید من هم می بینم .
Dim P As New Parent
واقعا از نوع Parent است .

ولی همان طور که میبینیم
Dim RefParent As Parent = New Child
این شی از منبع Parent گرفته شده . ولی با شی Child ، نمونه گیری شده .

که به گفته همان نویسنده سایت ، این یک شی از Child است که به Parent اشاره می کند .

موفق باشید . یا حق

odiseh
شنبه 07 دی 1387, 11:53 صبح
آیا متغیرهای از نوع Class ، تا قبل از اینکه نمونه گیری شوند (با دستور New) ، فضایی را اشغال می کنند؟
به نظر من که نمی کنند زیرا هنوز کامپایلر نمی داند که از چه جنسی هستند تا در Heap به آنها فضا بدهد.

vcldeveloper
شنبه 07 دی 1387, 16:59 عصر
آیا متغیرهای از نوع Class ، تا قبل از اینکه نمونه گیری شوند (با دستور New) ، فضایی را اشغال می کنند؟
فضایی به اندازه یک Pointer (در سیستم های 32 بیتی 4 بایت، در سیستم های 64 بیتی 8 بایت) بر روی Stack اشغال می کنند که مقدارش null هست. وقتی شی با استفاده از New ایجاد میشه، حافظه مورد نیاز برای فیلدهای آن، و آدرس متدهایی که Static نیستند، بر روی Heap تخصیص داده می شود.

Amir Oveisi
شنبه 07 دی 1387, 17:41 عصر
بحث Shadowing در شی گرایی خیلی شبیه به Overriding است .
با این تفاوت که واقعا ویژگی یا متد به ارث رسیده را نابود نمی کند .
بلکه مقادیر شی پدر نیز حفظ خواهد شد و میتوان به آن دسترسی داشت .

مگه تو ارث بری متد به ارث رسیده نابود میشه؟
اگر نابود میشد با
base.MethodName(); نمیشد اونو فراخونی کرد.

توضیحات کامل در مورد shadowing:
http://msdn.microsoft.com/en-us/library/c4swkw24.aspx

توضیحاتی در مورد تفاوت های overriding و shadowing:
http://msdn.microsoft.com/en-us/library/ms172785.aspx


موفق باشید
jooje

Chabok
شنبه 07 دی 1387, 18:58 عصر
مگه تو ارث بری متد به ارث رسیده نابود میشه؟
اگر نابود میشد با

base.MethodName();

نمیشد اونو فراخونی کرد.منظورم از نابودی در Overridng ویژگی های قبلی بود . نه ترکوندن :لبخند:

یا حق

odiseh
یک شنبه 08 دی 1387, 10:02 صبح
بچه ها
به نظر شما ها، اصلا کجا (چه شرایطی) نیاز میشه تا ما چنین Variable Declaration رو انجام بدین تا اونوقت داستان Shadowing و Overriding مطرح بشه؟

Dim RefParent As Parent = New Child
و اینکه ضمن تشکر از همه شما ، در ادامه پاراف شما استاد گرامی، آقای کشاورز، این Declaration ای به چه صورت در Heap و Stack انجام میشه؟

Amir Oveisi
یک شنبه 08 دی 1387, 10:09 صبح
در مورد استفاده از overriding فکر نکنم احتیاجی به توضیح باشه
اما shadowing زمانی استفاده میشه که ما بخوایم از فیلدهای کلاس base در برابر تغییرات احتمالی محافظت کنیم ضمن اینکه هنوزم بتونیم بهش دسترسی مستقیم داشته باشیم.
در مورد سوال دوم:
یک اشاره گر به نوع داده Parent توی stack ایجاد میشه و زمانی که New انجام میشه توی heap فضا برای متغیری از نوع Child ایجاد میشه و اون اشاره گر که تو Stack بود به اینی که تو heap درست شد اشاره میکنه.

موفق باشید
jooje

odiseh
یک شنبه 08 دی 1387, 11:16 صبح
جناب آقای bermooda


به نظر شما ، اصلا کجا (چه شرایطی) نیاز میشه تا ما چنین Variable Declaration رو انجام بدیم؟

Dim RefParent As Parent = New Child

خوب اگه ما بخواهیم با base class کار کنیم صاف میریم سراغ اون کلاس و اگه بخواهیم با derived کار کنیم از اون instance می گیریم و با اون کار می کنیم دیگه.

ولی من می بینم که این بحثها و تفاوت ناشی از Shadowing و Overriding زمانی مطرح میشه که چنین نمونه گیری رو داشته باشیم درسته؟

Amir Oveisi
یک شنبه 08 دی 1387, 11:26 صبح
درسته میشه اونجوریم که شما میگین مجزا کار کرد ولی این بحث ها تو polymorphism مطرح هستن که از کلاس base به جای child ها استفاده میشه و بصورت خودکار type مناسب انتخاب میشه و جایگزین میشه.

در کورد polymorphism جستجو کنید به جواب میرسید.

موفق باشید
jooje