PDA

View Full Version : سوال: وراثت چندگانه



newsoft
یک شنبه 30 خرداد 1389, 11:45 صبح
آیا با استفاده از واسط می توان وراثت چندگانه را در سی شارپ پیاده سازی کرد؟

amir-yeketaz
یک شنبه 30 خرداد 1389, 12:30 عصر
به این تاپیک برو :
http://barnamenevis.org/forum/showthread.php?t=224571

جوابت تو اینجاست ...
موفق باشید

cardano7
یک شنبه 30 خرداد 1389, 12:54 عصر
سلام
اکیدا تاکید می کنم که نمیشه.
یک کلاس حد اکثر از یک کلاس دیگه می تونه مشتق بشه. و وراثت چندگانه وجود نداره. اما می تونه 1000 تا Interface را Implement کنه.
گاهی میشه با تغییر ترتیب مشتق گیری مشکل را حل کرد. اما در این زمینه هم دست شما بسته هست.
این مثال تجربه ی شخصی خودمه:
فرض کنید که فرم شما باید از کلاس A مشتق بشه. از طرفی مجبوره که از کلاس Form هم مشتق بشه. حالا راه حل چیه؟ شما می تونید A را از Form مشتق کنید بعد فرم خودتون رو از A مشتق کنید و بدین شکل قائله رو ختم به خیر کنید. البته همیشه به این سادگی هم نیست.

newsoft
یک شنبه 30 خرداد 1389, 13:21 عصر
2) interface as multiinherince: در کلاس ها فقط از یک کلاس میتونی ارث بری کنی ولی با پیادهسازی اینترفیس میتونی از ارث بری چندگانه بهره ببری!!
و.....


کسی در موردش می تونه توضیح بده





http://barnamenevis.org/forum/showthread.php?t=224571

cardano7
یک شنبه 30 خرداد 1389, 16:12 عصر
2) interface as multiinherince: در کلاس ها فقط از یک کلاس میتونی ارث بری کنی ولی با پیادهسازی اینترفیس میتونی از ارث بری چندگانه بهره ببری!!
و.....


interface رو مردم implement می کنند نه مشتق گیری.
به چه دردی می خوره که interface چندگانه داشته باشی وقتی نمی تونی چیزی داخلشون پیاده سازی کنی؟ البته قبول دارم گاهی به درد می خوره، اما اغلب جواب گوی کار ما نیست.

newsoft
یک شنبه 30 خرداد 1389, 17:07 عصر
من نمی دونم اصلا بدرد می خوره یا نه
استاد این سوال چند وقت پیش تو کلاس پرسید: که آیا با استفاده از واسط می توان وراثت چندگانه را در سی شارپ پیاده سازی کرد؟یا خیر

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


فردا معلوم میشه

cardano7
یک شنبه 30 خرداد 1389, 19:01 عصر
آخه بستگی داره " وراثت چندگانه " رو چطور تفسیر کنیم.
مفاهیم رو می دونم! اما اگه بخواهیم به طور رسمی نظر بدیم، نیاز به جواب یک نفر داریم که تو این زمینه دقیق اطلاعات داشته باشه.
تو این فروم ها هم که همه رو هوا واسه خودشون نظر می دند. اعتقاد هم دارند که نظرشون 100 در 100 درسته. بماند که خود اساتید هم هر جور عشقشون کشید نظر میدند(اونا هم از جنس همین آدم های توی فروم هستند که امکانات براشون فراهم بوده).
خلاصه جواب ها رو بشنو اما از من میشنوی خودت و امتحانت رو دست اینا نسپار!

Saeed.Masoumi
یک شنبه 30 خرداد 1389, 20:33 عصر
سلام دوست عزیز:


ابتدا باید از خود بپرسید چه نیازی به وراثت چند گانه است؟ایا راه بهتری بر فرض وراست سلسله مراتبی وجود ندارد؟
سپس باید از خودت بپرسی چرا سی شارپ از وراثت چند گانه از کلاس ها پشتیبانی نمیکند؟
بعد از جواب دادن به سوالات بالا باید ببینی هنوز هم می خوای از وراثت چند گانه استفاده کین؟ایا راهی برای این کار در سی شارپ هست؟
اولین موردی که به ذهنت می رسه اینه که Interface اما باید فکر کنید دلیل وجود اینتر فیس فقط به خاطر همین وراثت چند گانه است؟؟

کمک هم می خواین این جا هست:
برای سوال دوم:
این لینک (http://blogs.msdn.com/b/csharpfaq/archive/2004/03/07/why-doesn-t-c-support-multiple-inheritance.aspx)
برای سوال سوم:
این لینک (http://www.c-sharpcorner.com/UploadFile/cbreakspear/MultipleInheritance11082005004843AM/MultipleInheritance.aspx)
برای این که بدونی اینترفیس چیست و دلایل ظهورش چیه اینجا رو ببین:
این لینک (http://msdn.microsoft.com/en-us/library/ms173156.aspx)
در هر صورت سوال استاد شما سوال عجیبی است!!!؟ به دلیل ناقص بودن سوال می شه جواب داد هم آره و هم نه

newsoft
یک شنبه 30 خرداد 1389, 20:47 عصر
جواب اینجور سوالات که توی هیچ کتابی پیدا نمیشه
باید توی همچین جایی دنبالش گشت
دوستان لطف می کنن جواب میدن (نظر خودشون می گن) درست یا غلط

mohsensaghafi
یک شنبه 30 خرداد 1389, 21:00 عصر
سلام دوست عزیز.


ابتدا باید از خود بپرسید چه نیازی به وراثت چند گانه است؟ایا راه بهتری بر فرض وراست سلسله مراتبی وجود ندارد؟
وراثت چند گانه در برنامه نویسی نیاز هست. در دنیای طبیعی هم وجود داره. فرض کنید ما جانوارن رو به دو کلاس پستانداران و تخم گذاران تقسیم بندی کردیم. حال در استرالیا یک جانور وجود داره که هم پستانداره هم تخمگذار. پس نمی توان به همین سادگی حکم به رد وراثت چندگانه داد.
در جواب قسمت دوم سوالتون باید بگم که در صورتی که راهی هم وجود داشته باشه، باز هم از هدف اصلی شی گرایی خیلی دورمون می کنه. یادمون نره که هدف از شی گرایی استفاده از همان اشیاء فضای مسئله در فضای حل بود. با این حالت ما داریم شی ها رو طوری پیاده سازی می کنیم که می تونیم پیاده سازی کنیم و این به نظرم مشکل داره.

سپس باید از خودت بپرسی چرا سی شارپ از وراثت چند گانه از کلاس ها پشتیبانی نمیکند؟
اما دلیل اینکه C# از این نوع وراثت پشتیبانی نمی کند، دلیل بر عدم نیاز اون در برنامه نویسی نیست. یکی از دلایلش اینه که جاوا هم از این نوع وراثت استفاده نمی کنه. دلیل جاوا هم اینه که در این نوع ارث بری بعضا مشکلاتی پیش می آید در مورد متد ها و Attribute ها که برای حل این مشکلات ساده ترین راه یعنی حذف صورت مسئله رو انتخاب کرده.
دلیل این حذف هر چی که باشه که به نظرم در هر دوی این زبانها این یک نقص بزرگ بوجود می آره .

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


اولین موردی که به ذهنت می رسه اینه که Interface اما باید فکر کنید دلیل وجود اینتر فیس فقط به خاطر همین وراثت چند گانه است؟
در این مورد کاملا با نظر شما موافقم

cardano7
یک شنبه 30 خرداد 1389, 22:11 عصر
http://blogs.msdn.com/b/csharpfaq/archive/2004/03/07/why-doesn-t-c-support-multiple-inheritance.aspx


ممنون از لینک هایی که قرار میدید.
البته من با نظر خیلی ها در مورد اینکه آدم منابع لاتین رو سرچ کنه خیلی موافق نیستم. چون در اکثر موارد این صفحات به دست غیر native ها نوشته میشه. یک عده آلمانی و چینی و لهستانی و هندی، هر کدوم با قواعد زبان خودشون مطلب می نویسند. طوری که خوندنش فقط سر درد میاره. و گر نه اگه خوب نوشته بشه من اتفاقا از مطالب لاتین استقبال می کنم.

به هر حال،
مطالب این صفحه چندان قانع کننده نوشته نشده(نمیگم غلطه).


Different languages actually have different expectations for how MI works.
یعنی C#‎‎ همه ی کارهاش رو باید با زبان های دیگه هماهنگ کنه؟
حتی اگه این طور باشه، چرا فقط وراثت رو با اونا هماهنگ کرده؟
همه چیز فقط در Interop خلاصه میشه؟


The number of places where MI is truly appropriate is actually quite small.
غلط های نگارشیش به کنار،
این که نشد دلیل.


Multiple implementation inheritance injects a lot of complexity into the implementation.
مثلا چه مشکلی پیش میاد؟
multiple interface inheritance هم ارزونی خودش!


البته مدت هاست خودم به این عادت کردم که وراثت چند گانه رو کنار بگذارم(قبلا ویژوال سی ++) کار می کردم. اما برام عجیبه که زبان های دیگری که وراثت چند گانه رو دارند چه مشکلی براشون پیش اومده که C#‎‎ این قابلیت رو کنار گذاشته؟

Saeed.Masoumi
دوشنبه 31 خرداد 1389, 00:49 صبح
راثت چند گانه در برنامه نویسی نیاز هست. در دنیای طبیعی هم وجود داره. فرض کنید ما جانوارن رو به دو کلاس پستانداران و تخم گذاران تقسیم بندی کردیم. حال در استرالیا یک جانور وجود داره که هم پستانداره هم تخمگذار. پس نمی توان به همین سادگی حکم به رد وراثت چندگانه داد. با تشکر از شما دوست عزیز اما اینجا ذکر چند تا نکته لازمه:


من یک کلاس دارم به نام پستاندار (مشتق شده از مهره داران)
من یک کلاس دارم به نام تخم گذار که از یکی از سه کلاس زیر ارث بری کرده اند:




ماهیها (مشتق شده از مهره داران)
پرندگان (مشتق شده از مهره داران)
خزندگان (مشتق شده از مهره داران)
دوزیستان (مشتق شده از مهره داران)




حالا یک کلاس جدید می خواهم ایجاد کنم به نام پلاتیپوس که قرار است هم پستاندار باشد هم تخم گذار یعنی این کلاس هم از پستانداران ارث بری می کند هم از مجموعه ی {ماهیها یا پرندگان یا خزندگان یا دوزیستان}

خوب حالا ما به فرض با روش وراثت چندگانه این موجود جدید رو ایجاد کردیم.
چه مشکلاتی به وجود می آید؟چند احتمال زیر می تواند مشکل باشد:



اگر از پرندگان ارث بری شده باشد بدن آن حیوان حتما از پر پوشیده شده است.(صفت) - پلاتیپوس پشم/خز دارد نه پر
اگر از ماهیها ارث بری شده باشد حتما آبشش دارد (صفت)- خیر شش دارد
اگر از خزندگان ارث بری شده باشد حتما خونسر است(رفتار) - خیر حیوانات پستاندار خونگرم است.
اگر از دوزیستان ارث بری شده باشد حتما دگر دیسی داشته است (رفتار) - خیر


حالا اگر به جای وراثت چند گانه بیایم و به این کلاس جدید به عنوان گونه ای جدید از کلاس پایه پستانداران بنگریم پس می توان کلاس جدید پلاتیپوس را این گونه ساخت:
کلاسی است که از کلاس پستانداران مشتق شده و در عین حال دارای صفت جدید به نام تخم گذار است همین.


می توان اینترفیسی ساخت که داخل آن الزام شده حتما تخم گذار ( و نه چیزی اضافه ) بایستی پیاده سازی شود.
می توان همین کار را با ساختن کلاسی جدید به نام پلاتیپوس ایجاد کرد با خاصیتی/رفتار جدیدی به نام تخم گذاری.

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

مثلا چه مشکلی پیش میاد؟سلام اینو فعلا بخونید.
مشکلات وراثت چند گانه و چند شکلی پیچیده در C#‎‎‎‎‎‎‎‎‎‎‎‎ (http://barnamenevis.org/forum/showthread.php?t=74234)


به نظر من از این سوال واضح تر که نمیشه دوست عزیز میشه کد زیر رو توضیح بدی نقش اینترفیس برای وراثت چیه؟


interface IBase
{
void MustDefineMe(int Parameter);
int Property { get; set; }
}
class DrivedClass1:IBase
{
int Variable;
public void MustDefineMe(int Parameter)
{
//You can do anything
}
public int Property { get { return 0; } set { this.Variable=value; } }
}
و
abstract class Base : IBase
{
public int Property { get; set; }
public virtual void MustDefineMe(int Parameter)
{
this.Property++;
}
}
class DrivedClass2 : Base
{
public override void MustDefineMe(int Parameter)
{
//Can do anything
base.MustDefineMe(Parameter);
}
}

ادامه بدید بحث جالب است.
موفق باشید

اَرژنگ
دوشنبه 31 خرداد 1389, 05:26 صبح
من نمی دونم اصلا بدرد می خوره یا نه
استاد این سوال چند وقت پیش تو کلاس پرسید: که آیا با استفاده از واسط می توان وراثت چندگانه را در سی شارپ پیاده سازی کرد؟یا خیر

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


فردا معلوم میشه
اگر یکی بپرسه "با چه مقدار پر مرق میشه یک خروس را در یک گاو پیاده سازی کرد؟" ،بتوانید جواب بدید،به اون سوال استاد شما هم میشه جواب داد.
سوال گمراه کننده است. معنی ندارد و جواب دادن به سوال مبهم از بیکاری بدتر است.
۱.گمراه کننده است به این دلیل:
وراثت بری در شیگرائی یعنی اینکه داشتن کد در یک جا (در یک کلاس جد) و قابلیت تغییر دهیش در یک کلاس متولد از اون کلاس.
وراثت چندگانه و چند ریختی بودن را با هم اشتباه گرفته. با واسط یک نوع از چند ریختی بودن را پیاده میکنند، یا اینکه اگر یکجور دیگر بیان کنیم :
با استفاده از واسط میشه یک نوع از چند ریختی بودن را ضاحر سازی کرد.
مفهومات وراثت بری و چند ریختگی از هم کاملا جدا هستند و باید به شکل جدا از هم بررسی بشند،
در ضاحر تنها جایی که با هردوشان میشه به یک شکل برخورد زمانی است که با چندریختگی باهاشان کار میکنیم و در حقیقت ۲ نوع چند ریختگی متفاوت را نشان میدن:
۱.چند ریختگی از لحاض نوعی (Type Polymorphism) که از همان ارث بری ناشع میشه و
۲.چند ریختگی ضاحری (Interface Polymorphism) که از پیاده کردن و استفاده از واسطهایه مختلف ناشع میشه.
چند ریختگیهایه دیگر هم وجود دارند که در این پست بهشان توجه نکردیم.

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

newsoft
دوشنبه 31 خرداد 1389, 11:54 صبح
دوست عزیز میشه کد زیر رو توضیح بدی نقش اینترفیس برای وراثت چیه؟

interface IBase
یه واسط تعریف کردی که باید توی تمام کلاس هایی که از این واسط استفاده می کنن باید
این تابع
void MustDefineMe(int Parameter);و این مغییر(خاصیت)
int Property { get; set; }
داشته باشه


بعدش یه کلاس تعریف کردی
class DrivedClass1:IBase

که از این واسط به ارث می بره


بعد یه کلاس انتظاعی درست کردی که از همون واسط ارث میبره
abstract class Base : IBase


در آخر هم یه کلاس دیکه ای درست کردی که از کلاس انتظاعی قبلی به ارث می بره
class DrivedClass2 : Base

درست گفتم
اینقدر دیگه حالیون می شه:متفکر:

newsoft
دوشنبه 31 خرداد 1389, 11:58 صبح
اگر یکی بپرسه "با چه مقدار پر مرق میشه یک خروس را در یک گاو پیاده سازی کرد؟" ،بتوانید جواب بدید،به اون سوال استاد شما هم میشه جواب داد.
سوال گمراه کننده است. معنی ندارد و جواب دادن به سوال مبهم از بیکاری بدتر است.
۱.گمراه کننده است به این دلیل:
وراثت بری در شیگرائی یعنی اینکه داشتن کد در یک جا (در یک کلاس جد) و قابلیت تغییر دهیش در یک کلاس متولد از اون کلاس.
وراثت چندگانه و چند ریختی بودن را با هم اشتباه گرفته. با واسط یک نوع از چند ریختی بودن را پیاده میکنند، یا اینکه اگر یکجور دیگر بیان کنیم :
با استفاده از واسط میشه یک نوع از چند ریختی بودن را ضاحر سازی کرد.
مفهومات وراثت بری و چند ریختگی از هم کاملا جدا هستند و باید به شکل جدا از هم بررسی بشند،
در ضاحر تنها جایی که با هردوشان میشه به یک شکل برخورد زمانی است که با چندریختگی باهاشان کار میکنیم و در حقیقت ۲ نوع چند ریختگی متفاوت را نشان میدن:
۱.چند ریختگی از لحاض نوعی (Type Polymorphism) که از همان ارث بری ناشع میشه و
۲.چند ریختگی ضاحری (Interface Polymorphism) که از پیاده کردن و استفاده از واسطهایه مختلف ناشع میشه.
چند ریختگیهایه دیگر هم وجود دارند که در این پست بهشان توجه نکردیم.

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

Saeed.Masoumi
دوشنبه 31 خرداد 1389, 12:37 عصر
دوست عزیز میشه کد زیر رو توضیح بدی نقش اینترفیس برای وراثت چیه؟

interface IBase
یه واسط تعریف کردی که باید توی تمام کلاس هایی که از این واسط استفاده می کنن باید
این تابع
void MustDefineMe(int Parameter);و این مغییر(خاصیت)
int Property { get; set; }
داشته باشه


بعدش یه کلاس تعریف کردی
class DrivedClass1:IBase

که از این واسط به ارث می بره


بعد یه کلاس انتظاعی درست کردی که از همون واسط ارث میبره
abstract class Base : IBase


در آخر هم یه کلاس دیکه ای درست کردی که از کلاس انتظاعی قبلی به ارث می بره
class DrivedClass2 : Base

درست گفتم
اینقدر دیگه حالیون می شه:متفکر:
اول از همه سلام
دوم با توجه به جمله آخرتون:دوست عزیز من که نگفتم خدای نکرده شما یاد ندارید یا مثلا من بهتر از شما هستم دوست عزیز یک بحثی رو ایجاد کردین که منم علاقه مند شدم می خوام به یک جایی برسه لا اقل خودم یک چیزی یاد بگیرم.
اما در مورد جوابتون نقشش در ارث بری رو خواسته بودم که شما فرمودین در هر دوحالت از اون اینترفیس مشتق شده بودند با توضیحات اقای ارژنگ و این جواب شما ...
نمی دونم اگر بحث را با این نیت شروع کردید که می دانید با اینترفیس می توان وراثت چندگانه پیاده سازی کرد دیگه فایده نداره این پست رو ادامه بدیم
اما اگر شما هم مثل من نمی دانید بهتر است پست های قبلی رایک مرور کنید و جواب سوال بالا رو بدین
من همیشه سعی دارم روی دانسته هایم تعصب نداشته باشم
طبق گفته ی دکارت:هر گاه خواستی راجع به برهانی قاطعا نظر بدی باید هر چیزی که به اونها یقین داشتی رو زیر سوال ببری و...

باز هم از هدف اصلی شی گرایی خیلی دورمون می کنه. یادمون نره که هدف از شی گرایی استفاده از همان اشیاء فضای مسئله در فضای حل بود. با این حالت ما داریم شی ها رو طوری پیاده سازی می کنیم که می تونیم پیاده سازی کنیم و این به نظرم مشکل داره.
دوست عزیز به نظر من اگر می خواستیم همون مسئله رو از وراثت چندگانه پیاده سازی کنیم یک سری مشخصات و رفتار های اضافی به وجود می آید که به درد موجودی مثل پلاتیپوس نمی خوره چرا باید همچین مشخصاتی داشته باشیم؟
خوشحال می شم برام توضیح بدین
از نظر من تا اینجای بحث تمومه منتظر دوستان دیگر می مونیم تا بیشتر یاد بگیریم

موفق باشید

mohsensaghafi
دوشنبه 31 خرداد 1389, 14:53 عصر
با تشکر از شما دوست عزیز اما اینجا ذکر چند تا نکته لازمه:


من یک کلاس دارم به نام پستاندار (مشتق شده از مهره داران)
من یک کلاس دارم به نام تخم گذار که از یکی از سه کلاس زیر ارث بری کرده اند:




ماهیها (مشتق شده از مهره داران)
پرندگان (مشتق شده از مهره داران)
خزندگان (مشتق شده از مهره داران)
دوزیستان (مشتق شده از مهره داران)




حالا یک کلاس جدید می خواهم ایجاد کنم به نام پلاتیپوس که قرار است هم پستاندار باشد هم تخم گذار یعنی این کلاس هم از پستانداران ارث بری می کند هم از مجموعه ی {ماهیها یا پرندگان یا خزندگان یا دوزیستان}

خوب حالا ما به فرض با روش وراثت چندگانه این موجود جدید رو ایجاد کردیم.
چه مشکلاتی به وجود می آید؟چند احتمال زیر می تواند مشکل باشد:



اگر از پرندگان ارث بری شده باشد بدن آن حیوان حتما از پر پوشیده شده است.(صفت) - پلاتیپوس پشم/خز دارد نه پر
اگر از ماهیها ارث بری شده باشد حتما آبشش دارد (صفت)- خیر شش دارد
اگر از خزندگان ارث بری شده باشد حتما خونسر است(رفتار) - خیر حیوانات پستاندار خونگرم است.
اگر از دوزیستان ارث بری شده باشد حتما دگر دیسی داشته است (رفتار) - خیر


حالا اگر به جای وراثت چند گانه بیایم و به این کلاس جدید به عنوان گونه ای جدید از کلاس پایه پستانداران بنگریم پس می توان کلاس جدید پلاتیپوس را این گونه ساخت:
کلاسی است که از کلاس پستانداران مشتق شده و در عین حال دارای صفت جدید به نام تخم گذار است همین.


می توان اینترفیسی ساخت که داخل آن الزام شده حتما تخم گذار ( و نه چیزی اضافه ) بایستی پیاده سازی شود.
می توان همین کار را با ساختن کلاسی جدید به نام پلاتیپوس ایجاد کرد با خاصیتی/رفتار جدیدی به نام تخم گذاری.

حال اگر بخواهم ارنی تورنگ را هم نمونه سازی کنم فقط کافی است از این گونه جدید (پلاتیپوس) instance بگیرم.
البته این مسئله نیاز به بررسی بیشتری دارد اما اگر نیاز باشد من کلاس پلاتیپوس را ایجاد کنم از همین روش دوم استفاده می کنم.(این نظر کاملا شخصی است و امکان دارد در صورتی که به اشتباهاتم پی بردم دیگر این روش را قبول نداشته باشم)
سلام اینو فعلا بخونید.
مشکلات وراثت چند گانه و چند شکلی پیچیده در C#‎‎‎‎‎‎‎‎‎‎‎‎ (http://barnamenevis.org/forum/showthread.php?t=74234)

دوست عزیز میشه کد زیر رو توضیح بدی نقش اینترفیس برای وراثت چیه؟


interface IBase
{
void MustDefineMe(int Parameter);
int Property { get; set; }
}
class DrivedClass1:IBase
{
int Variable;
public void MustDefineMe(int Parameter)
{
//You can do anything
}
public int Property { get { return 0; } set { this.Variable=value; } }
}
و
abstract class Base : IBase
{
public int Property { get; set; }
public virtual void MustDefineMe(int Parameter)
{
this.Property++;
}
}
class DrivedClass2 : Base
{
public override void MustDefineMe(int Parameter)
{
//Can do anything
base.MustDefineMe(Parameter);
}
}

ادامه بدید بحث جالب است.
موفق باشید





سلام دوست عزیز.
در مثالی که شما زدید، قرار نیست که ما از یکی از گونه های تخم گذاران ارث بری کنیم. ما از خود کلاس تخم گذاران ارث بری می کنیم. اون چهار تا گونه هم که گفتید هر کدام از کلاس تخم گذاران ارث بری کرده اند. ما نیازی نیست از کلاسهای مشتق شده ی یک کلاس ارث بری کنیم. در اینجا از خود کلاس ارث بری می کنیم و مشکلی هم پیش نمی آید.
راه حل هایی که ارائه دادید اولیش کاملا با توجه به زبانهایی چون C#‎‎ و java بود و دومیش بر خلاف اصول شی گرایی. اگر اینجا بحث بر سر شی گرایی در C#‎‎ است خرف شما کاملا درسته اما اگر بر سر اصول و بیانی وراثت چندگانه باشه به نظرم جای کمی تفکر بیشتر است.
و اما اینکه ارث بری چند گانه مشکلات خودش رو داره قبول دارم. اما راه حلش پاک کردن صورت مسئله نیست. هر امکانی که یک زبان بوجود می آره یک یا چند پیچیدگی هم بدنبال داره که این وظیفه برنامه نویس هستش که از این امکانات درست استفاده کنه تا مشکلی پیش نیاد.

mehdi.mousavi
دوشنبه 31 خرداد 1389, 17:49 عصر
سلام.


آیا با استفاده از واسط می توان وراثت چندگانه را در سی شارپ پیاده سازی کرد؟

من حدس میزنم منظور ایشون، Explicit Interface Implementation بوده. دو Interface متفاوت رو در نظر بگیرید، که هر کدوم، متودی به اسم Test دارن. توسط Explicit Interface Implementation شما میتونید بین Test از Interface اول و متود Test از Interface دوم، تفاوت قائل بشید و بر حسب نیاز اونیکه مد نظرتون هستش رو Invoke کنید.

اگر منظور این باشه که آیا میشه چند Interface رو روی یک کلاس پیاده سازی کرد، بله. بازهم پاسخ مثبت هستش. اما اینکه یک کلاس، بتونه از بیش از یک کلاس مشتق بشه، (خواه اون Base Class شما abstract باشه یا نه)، خیر. چنین امری میسر نیستش. به بیان دیگه، همچین کدی نمیتونید داشته باشید:


public abstract class Test1
{
}

public abstract class Test2
{
}

public class MyTest1 : Test1, Test2
{
}


اما این کد، کاملا صحیح و معتبره:

interface ITest1
{
void MyMethod();
}

interface ITest2
{
void MyMethod();
}

class MyTest1 : ITest1, ITest2
{
void ITest1.MyMethod()
{
}

void ITest2.MyMethod()
{
}
}


حدس من اینه که استاد شما دنبال این پاسخ دوم هستش.


البته من با نظر خیلی ها در مورد اینکه آدم منابع لاتین رو سرچ کنه خیلی موافق نیستم. چون در اکثر موارد این صفحات به دست غیر native ها نوشته میشه. یک عده آلمانی و چینی و لهستانی و هندی، هر کدوم با قواعد زبان خودشون مطلب می نویسند. طوری که خوندنش فقط سر درد میاره. و گر نه اگه خوب نوشته بشه من اتفاقا از مطالب لاتین استقبال می کنم.

اگر دقت کنید، در ابتدای این مطلب این جمله رو خواهید دید:

This answer is from Chris Brumme via the following post (http://dotnetjunkies.com/WebLog/unknownreference/archive/2003/09/04/1401.aspx). I've copied the text in here in case the post disappears.

در واقع نویسنده مطلب، نقل قول مستقیم از Chris Brumme کرده. Chris کیه؟ یکی از اعضای تیم CLR مایکروسافت از سال 2003 بوده (تا کی رو خبر ندارم)، پس هر کسی نیست و همینجوری حرف نمیزنه.

ما در طراحی نرم افزار یا Framework ها، عموما به دو راهی هایی میرسیم که انتخاب یک راه، برامون مزایایی رو بهمراه داره اما این مزایا با قربانی کردن یک یا چند مزیت دیگه همراهه. به بیان دیگه، کیفیت یا جنبه ای از چیزی رو از دست میدیم، تا چیز دیگه ای رو بدست بیاریم. به چنین شرایطی میگن Trade Off. انتخاب این Trade Off ها باید بگونه ای باشه که حتی الامکان مزایای بدست اومده به مزایای از دست رفته بچربه.

.NET قرار بود از ابتدا چند زبان رو پشتیبانی کنه، اما پیاده سازی Multiple Inheritance (که از این پس MI مینویسم) در برخی از زبانها ارزش زمان گذاشتن رو نداشتش و باعث میشد Syntax چنین زبانهایی پیچیده بشه. بعنوان مثال VB رو در نظر بگیرید. اکثریت بدلیل سادگی Syntax این زبان هستش که در ابتدا جذب اون میشن، اما معرفی MI ها میتونست پیچیدگیهایی رو به این زبان اضافه کنه، که قشر وسیعتری از برنامه نویسها به اون اعتراض میکردن. مایکروسافت میدونست که تعداد افراد کمتری به نبود MI اعتراض میکنن، تا پیچیده شدن زبان VB. (این یه Trade Off بوده برای مایکروسافت).

دلیل بعدی (البته دلائل رو Chris کاملا روشن کرده، اما من از دید خودم دارم به سوال شما پاسخ میدم) عدم پیاده سازی MI ها، دشوار بودن تضمین CLS-Compilant بودن یک Component بودش. زبانهای متفاوت، پیاده سازیهای متفاوت دارن، و وقتی شما تو نقطه ای میشینید که قرار یه Solution ای ارائه کنید، که فارق از زبان و تکنولوژی بین چند سیستم قابل فهم باشه، اونوقت باید تصمیماتی بگیرید که گرفتن اون تصمیمات اصلا آسون نیست و هر تصمیمی با قشر عظیمی از اعتراضات مواجه خواهد شد. اگر با COM/COM+ آشنا باشید، کاملا متوجه منظورم میشید.

ابهام زدایی، که یکی از دلائل مهم Type-Safe بودن زبانهای .NET هستش دلیل عمده دیگه ای بود که MI رو تیم مربوطه پیاده سازی نکنه. اگر با C++ خوب آشنا باشید و بدونید vtable چی هستش و چگونه کار میکنه، اونوقت متوجه میشید که چه ابهامات هنگام پیاده سازی MI ممکنه برای برنامه نویس پیش بیاد، فلان Reference رو میخوام UpCast کنم، DownCast کنم، به Object یک اشاره کنه، نه دو رو اینجا میخوام آدرس کنم و ... مسائلی هستش که در MI برنامه نویس باهاش مواجه میشه. این مسائل رو من بارها تو C++ بهشون برمیخوردم، که با یک Cast ساده مشکل حل میشد، اما نفر بعدی که کد رو میدید، باید 20 دقیقه فکر میکرد که چطوری فلان Instance از یک کلاس به فلان Instance تبدیل شده. یا Break Point توی متودی میذاشت، و متوجه نمیشد که چرا برنامه Break نمیخوره، در حالیکه برنامه کار خودش رو بخوبی انجام میداد. همین ابهامات در C++ بودش که اونو زبان خاصی کرده و خیلی ها ازش فراری هستن. اگر قرار بود همین پیچیدگیها در .NET نیز وجود داشته باشه، دیگه چه دلیلی داشت چنین محیطی بوجود بیاد؟

ساده نگه داشتن Language Semantic دلیل دیگه میتونست باشه. ما 20% از وقتمون رو صرف نوشتن کد میکنیم، اما 80% زمانمون رو صرف خوندن اونها میکنیم. اگر قرار بود MI ها در .NET نیز پیاده سازی بشن، اونوقت Semantic زبان دشوار میشد و بازهم مایکروسافت ایده اصلی استفاده ساده از Framework رو اینجا باید قربانی میکرد.

در طراحی یک زبان، چنین Trade Off هایی وجود داره و من و شما اینور گود نشستیم و فقط میگیم نیست، باید باشه، نیست، نباید باشه، هست ولی نباید باشه و ... در صورتیکه وقتی به درون قضیه میریم، میبینیم اگر ما هم بودیم، انتخاب دیگه ای نمیکردیم.


تو این فروم ها هم که همه رو هوا واسه خودشون نظر می دند. اعتقاد هم دارند که نظرشون 100 در 100 درسته. بماند که خود اساتید هم هر جور عشقشون کشید نظر میدند

وقتی میخواهید در مورد عموم مردم صحبت کنید، قبل از اینکه یکبار حرف بزنید، دو بار فکر کنید. (البته من این توصیه رو به همه میکنم، چه بخوان در مورد مردم حرف بزنن، چه نخوان این کارو کنن).



من نمی دونم اصلا بدرد می خوره یا نه استاد این سوال چند وقت پیش تو کلاس پرسید: که آیا با استفاده از واسط می توان وراثت چندگانه را در سی شارپ پیاده سازی کرد؟ یا خیر به احتمال زیاد تو امتحان فرداش میده یا شاید هم می خواست شاخ مارو بشکنه فردا معلوم میشه

خوب. جواب معلوم شد؟

موفق باشید.