PDA

View Full Version : ارث بری چندگانه



eshpilen
پنج شنبه 06 خرداد 1389, 14:02 عصر
من شروع کردم دارم رفرنس زبان سی شارپ رو میخونم رسیدم به اینجاش دیدم نوشته ظاهرا ارث بری single رو داره. یعنی ارث بری چندگانه نداره سی شارپ؟
اونوقت چرا؟
چیز جالبیه ها بدرد میخوره :لبخند:

amir-yeketaz
پنج شنبه 06 خرداد 1389, 14:55 عصر
من شروع کردم دارم رفرنس زبان سی شارپ رو میخونم رسیدم به اینجاش دیدم نوشته ظاهرا ارث بری single رو داره. یعنی ارث بری چندگانه نداره سی شارپ؟
اونوقت چرا؟
چون که قاعده ی شی گرایی در جاوا وسی شارپ ارث بری سلسله مراتبی است ...
یکی از دلایلی که من میدونم اینه که همون طور که در سی پلاس شما میتونید ارث بری چند گانه داشته باشین ممکنه یه سری مشکلات مثه شبیه بودن نام فیلد ها و ... به وجود بیاد ولی در سی شارپ شما دیگر با این مشکلات سر کار ندارید و با دردسر کمتری برنامه نویسی می کنید ولی خوب در اینترفیس ها شما میتونید پیاده سازی چند گانه داشته باشین که تو اونجا میتونید هم به صورت مستقیم(explicit) و هم غیرمستقیم(implicit) به اون متود یا property مورد نظر دسترسی داشته باشین که شاید توی مباحث polymorphism براتون مفید واقع بشه ...
امیدوارم مفید واقع شده باشه ...
موفق باشید .

ricky22
پنج شنبه 06 خرداد 1389, 15:42 عصر
پس دستور multiinheritance چیه؟

s.khoshfekran
پنج شنبه 06 خرداد 1389, 19:45 عصر
دوست عزیز میتونی برای ارث بری چندگانه از Interface استفاده کرد

eshpilen
پنج شنبه 06 خرداد 1389, 20:22 عصر
بنظرم ارث بری چندگانه از Interface ها نمیتونه جایگزین کاملی ارث بری چندگانه از کلاسهای معمولی باشه.
چون Interface که Implementation نداره.
در ارث بری چندگانهء معمولی Implementation ها (هم) منتقل میشن، نه فقط Signature متدها.

FastCode
پنج شنبه 06 خرداد 1389, 20:33 عصر
بنظرم ارث بری چندگانه از Interface ها نمیتونه جایگزین کاملی ارث بری چندگانه از کلاسهای معمولی باشه.
چون Interface که Implementation نداره.
در ارث بری چندگانهء معمولی Implementation ها (هم) منتقل میشن، نه فقط Signature متدها.
راهش استفاده از یک کلاس abstractه که از یه اینترفیس که از چند تا اینترفیس ارثبری میکنه ارثبری کنه.

eshpilen
پنج شنبه 06 خرداد 1389, 22:00 عصر
من نمیفهمم شما چی میگید.
میشه با مثال توضیح بدید؟
مثلا من دوتا کلاس دارم از پیش که خودم ساختم برای کارهای خاصی، بعد میتونم در یک کلاس جدید براحتی از هردوش ارث بری کنم و متدها و پراپرتی های پیاده سازی شدهء هردو رو (نه فقط اینترفیس رو) با هم در یک کلاس جدید ترکیب شده داشته باشم (بعلاوهء متدها و پراپرتی های تعریف شده در کلاس جدید).
خب اینکار رو چطور میشه در سی شارپ انجام داد؟

sia_2007
پنج شنبه 06 خرداد 1389, 23:07 عصر
خیر
خیالت راحت.

eshpilen
پنج شنبه 06 خرداد 1389, 23:33 عصر
این شد حرف حساب :لبخند:

ظاهرا در جاوا هم همینطوره و ارث بری چندگانه نداره. چون این ویژگی رو ضروری ندیدن و بنظرشون معایبی داره.
البته حتی اورلودینگ عملگرها هم چنین مبحثی هست و توی جاوا تاجایی که میدونم اورلود عملگر هم نداریم (اما سی شارپ تاجایی که دیدم فکر میکنم داره).

دربارهء این موارد از هرکس بپرسی یه نظری داره. یکی میگه خوبه یکی میگه بده.
و هر زبانی از یکی از این دو روش پیروی میکنه (پس حتما بین صاحبنظرها و برنامه نویسان چیره دست هم اختلاف هست).
من خودم هنوز اونقدری صاحب صلاحیت نمی بینم خودم رو که نظر مشخصی در این ارتباط بدم.

amir-yeketaz
پنج شنبه 06 خرداد 1389, 23:50 عصر
ظاهرا در جاوا هم همینطوره و ارث بری چندگانه نداره. چون این ویژگی رو ضروری ندیدن و بنظرشون معایبی داره.
البته حتی اورلودینگ عملگرها هم چنین مبحثی هست و توی جاوا تاجایی که میدونم اورلود عملگر هم نداریم (اما سی شارپ تاجایی که دیدم فکر میکنم داره).

دربارهء این موارد از هرکس بپرسی یه نظری داره. یکی میگه خوبه یکی میگه بده.
و هر زبانی از یکی از این دو روش پیروی میکنه (پس حتما بین صاحبنظرها و برنامه نویسان چیره دست هم اختلاف هست).
من خودم هنوز اونقدری صاحب صلاحیت نمی بینم خودم رو که نظر مشخصی در این ارتباط بدم.
بله ... شما در سی شارپ میتونید از overload کردن عملگر ها استفاده کنید
ارث بری سلسله مراتبی هم یه سری معایب داره و هم یه سری مزایا ... ولی خوب به نظر من اینجوری برنامه نویس کمتر دچار سردرگمی میشه ولی خوب راه های زیادی وجود داره که اون طرح خودتون رو به صورت ارث بری چند گانه شبیه سازی کنید ...
به نظرم هیچ زبونی مثه جاوا تو بحث شی گرایی و قواعد اون پیشتاز نیست پس قواعد شی گرایی ایجاب میکنه که شما ارث بری چندگانه نداشته باشید

eshpilen
جمعه 07 خرداد 1389, 10:14 صبح
البته جاوا که زبان جدیدی بحساب نمیاد.
یکی از جالبترین زبانهایی که وجود داره، یعنی Python، ارث بری چندگانه هم داره.
البته جاوا در اصل فقط از پارادایم شیء گرایی پشتیبانی میکنه، اما پایتون مالتی پارادایم هست (مثل خیلی زبانهای دیگه؛ مثلا سی++).
پایتون از جاوا جدیدتر نیست، ولی خیلی ها اون رو بعنوان یکی از بهترین زبانهای موجود میشناسن. کدهای نوشته شده در این زبان اغلب کوتاهتر از زبانهای دیگر هستن و خوانایی برنامه هم بسیار بالاست.

eshpilen
جمعه 07 خرداد 1389, 10:21 صبح
راستی الان یه نگاهی به مقالهء ویکیپدیا دربارهء شیء گرایی کردم ببینم درمورد ارث بری چندگانه چی نوشته.


Multiple inheritance (http://en.wikipedia.org/wiki/Multiple_inheritance) is inheritance from more than one ancestor class, neither of these ancestors being an ancestor of the other. For example, independent classes could define Dogs and Cats, and a Chimera object could be created from these two which inherits all the (multiple) behavior of cats and dogs. This is not always supported, as it can be hard to implement.


میگه دلیل عدم پیاده سازی ارث بری چندگانه سخت بودن پیاده سازیش هست.
البته یه مقالهء دیگه هم هست درمورد خود ارث بری چندگانه که یک بخش دربارهء مشکلات منطقی ارث بری چندگانه داره (اما میگه زبانهایی هستن که این مشکلات رو برطرف کردن).

esmaeily-hosein
جمعه 07 خرداد 1389, 14:36 عصر
این سختی در framework چند صد برابر میشه و در بیشتر حالتها به deadlock منجر میشه برای همین معمولا پیاده سازی نشده . دلیل دیگش میتونه پیچیدگی برای برنامه نویس باشه در ضمن الگوهای متداول اکثرا با single inheritance حل میشوند .

eshpilen
چهارشنبه 12 خرداد 1389, 11:49 صبح
این سختی در framework چند صد برابر میشه و در بیشتر حالتها به deadlock منجر میشه برای همین معمولا پیاده سازی نشده .
مثالی چیزی میتونید بزنید یا بیشتر توضیح بدید؟
یعنی این سختی و deadlock چرا ایجاد میشه.

esmaeily-hosein
سه شنبه 18 خرداد 1389, 22:59 عصر
http://blogs.msdn.com/b/csharpfaq/archive/2004/03/07/85562.aspx

اینم جای دیگه خوندم

I do not know if you will get a concrete answer on this questions as I believe there are many reasons.

The strongest reason I have seen is the added complexity and uncertainty. With multiple inheritance, areas such as reflection, serialization, casting, and encapsulation of members become difficult to manage.

Another reason stems from what .NET is trying to accomplish, a common language. Each language can implement inheritance and more specifically multiple inheritance in different ways. How does that translate to the CLR? Then you add in shared based types between two inherited types and everything starts to get messy.

I believe there has been much consideration given to multiple inheritance, but it is a hard concept to get right.