PDA

View Full Version : سوال: چرا دات نت اجازه نمی ده از بیش از یک کلاس ارث ببریم؟؟؟؟!!!!



hanieh66
پنج شنبه 11 مهر 1387, 00:10 صبح
سلام

سوالم همینه که توی عنوان هستش.
چرا دات نت اجازه نمی ده که از بیش از یک کلاس ارث ببریم؟؟!!!
واقعا برام عجیبه این موضوع. می شه یک نفر چندتا دلیل منطقی و اصولی بده.

مثلا من می خوام از چندتا کلاس ابستراکت ارث ببرم توی یک کلاس و نه از چندتا اینترفیس. باید چیکار کنم خوب؟؟؟

jaza_sa
پنج شنبه 11 مهر 1387, 00:44 صبح
معماری C# یا بهتر بگیم .Net به نحویه که اجازه همچین کاری رو به ما نمیده
یکی از دلایلش ، مشکل شدن کد ها و پیچیده شدن اونهاست (؟)
ولی راه برای انجام چنین کاری بسته نیست

شما میتونید با استفاده از Interface ها به نحوی اینکار رو شبیه سازی کنید
همونطوری که میدونید ، یک کلاس میتونه از چند کلاس Interface مشتق بشه و در حقیقت با استفاده از این روش میشه مقاصد خودمون رو عملیاتی کنیم

hanieh66
پنج شنبه 11 مهر 1387, 00:57 صبح
یکی از دلایلش ، مشکل شدن کد ها و پیچیده شدن اونهاست


اگه یکی از دلایلش اینه دلایل دیگش چیه؟
می تونین بازم بگین؟

jaza_sa
پنج شنبه 11 مهر 1387, 01:53 صبح
Why not multiple inheritance in C# and java
http://bytes.com/forum/thread272582.html

Why doesn't C# support multiple inheritance?
http://blogs.msdn.com/csharpfaq/archive/2004/03/07/85562.aspx

یک مثال :
Simulated Multiple Inheritance Pattern for C#
http://www.codeproject.com/KB/architecture/smip.aspx

razavi_university
پنج شنبه 11 مهر 1387, 02:27 صبح
به زبان ساده شما نمی تونین والد یک شیی به ارث رسیده رو به راحتی پبدا کنین

#Laser
پنج شنبه 11 مهر 1387, 11:25 صبح
سلام :

باید خدمت شما عرض کنم که دات نت طراحی شد تا علاوه بر امکانات زیاد برنامه نویسی به ما این امکان رو بده که در اون به درستی از Object Oriented استفاده کنیم و به همین دلیل به زبانهایی که با این تکنولوژی کار میکنن True Object Oriented گفته می شه یعنی تمامی قواعد و قوانین برنامه نویسی شیء گرا در دات نت به درستی رعایت شده .
بنابراین باید بدونیم که اصل برنامه نویسی شیء گرا همین چیزی هست که در دات نت پیاده سازی شده. زبانهای دیگر برنامه نویسی غیر دات نتی فقط نام شیء گرا را با خود یدک میکشن. درسته که این زبانها امکانات زیادی از برنامه نویسی شیء گرا رو دارن ولی برخی از قوانینشون هم با اصل برنامه نویسی شی گراء تضاد داره.
پس به جای اینکه از خودمون بپرسیم چرا در دات نت ارث بری چندگانه وجود نداره باید بپرسیم چرا در زبانهای دیگر غیر دات نتی که شیء گرا هستن می شه از چند کلاس ارث برد ؟

برنامه نویسی شیء گرا از طبیعت و محیط اطرافمون الهام گرفته شده. بنابراین هر موجودی دارای یک والد هست و از یک شاخه مشتق می شه. ولی برخی موجودات با شاخه های ارث بری متفاوت دارای اشتراکاتی هستن. مثلا" انسان و ماشین دو شیء با شاخه های ارث بری متفاوت هستن ولی هر دو دارای این خاصیت مشترک هستن که می تونن حرکت کنن.
به همین دلیل در دات نت Interfaceها وجود دارن که بتونیم بین بعضی اشیاء که از دو والد جدا از هم مشتق شدن ولی اشتراکاتی دارن ارتباط خویشاوندی مجازی بوجود بیاریم.
در واقع این هم یکجور ارث بری چندگانه هست ولی با تعریف و استفاده درست.
چون در دات نت فقط میشه از یک کلاس ارث برد ولی میشه بی شمار Interface رو Implement کرد.
امیدوارم توضیحاتم کامل و قانع کننده بوده باشه.

vcldeveloper
پنج شنبه 11 مهر 1387, 12:55 عصر
بنابراین باید بدونیم که اصل برنامه نویسی شیء گرا همین چیزی هست که در دات نت پیاده سازی شده. زبانهای دیگر برنامه نویسی غیر دات نتی فقط نام شیء گرا را با خود یدک میکشن.
عجب! پس مثلا جاوا یک زبان شی گرا کامل نیست، یا فرضا ++C و دلفی با وجود اینکه زبان Hybrid هستند، در پیاده سازی شی گرایی آنها مشکل وجود داره؟!
برخی زبان ها اصلا شی گرا نیستند، یعنی قابلیتی برای تعریف کلاس، چند ریختی، ارث بری، و سایر مفاهیم شی گرایی ارائه نمی کنند، مثل C یا Pascal استاندارد.

برخی زبان ها فقط برخی قابلیت های شی گرایی را پیاده سازی می کنند، مثل VB.

برخی زبان ها کاملا از شی گرایی پشتیبانی می کنند، ولی در کنار آن از روش های دیگه هم پشتیبانی می کنند؛ یعنی برنامه نویس مجبور نیست حتما از شی گرایی استفاده کنه، ولی اگر خواست از این روش استفاده کنه، امکانات لازم براش فراهم هست، مثل ++C یا دلفی. به این زبان ها میگن زبان های Hybrid.

برخی زبان ها فقط از شی گرایی پشتیبانی می کنند، یعنی برنامه نویس باید از این روش استفاده کنه، مثل #C یا جاوا.

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

#Laser
پنج شنبه 11 مهر 1387, 14:06 عصر
نوشته های بنده چیزی جدا از مطالبی که شما نوشتید نیست.
شما هم به نوعی همون به چیزهایی اشاره کردی که من گفتم. اولا" من اصلا" به زبان خاصی اشاره نکردم. ولی همین زبانهایی که شما از اونها نام بردی مثل C و Pascal کلا" Structured هستند و هیچ اثری از شیء گرایی در اونها یافت نمی شه که این زبانها بحث کاملا" جدایی دارن.

ولی در زبانهای دیگری هم که شما گفتین درسته که از نظر علمی اسمی به نام Hybrid روشون گذاشته شده ولی این هم به نوعی پاک کردن صورت مساله هست چون همه ++C و Java رو به اسم شیء گرا می شناسند و تمامی مطالب موجود در شیءگرایی در اونها قابل پیاده سازی هست ولی همونطور که شما اشاره کردین میشه در این زبانها برخی قوانین رو نقض کرد. پس این زبانها همگی شیء گرا هستن ولی کاملا" و یا به اصطلاح درست تر به درستی شیء گرا نیستن. ولی در زبانهای تحت دات نت باز هم در تصدیق مطالب شما فقط باید از شیء گرایی استفاده کرد و در اون هیچ قانون و تبصره ای برای روشهای غیر شیء گرایی وجود نداره بنابراین زبانهای دات نتی زبانهای True Object Oriented هستن که شما در اونها خیالتون راحته که جز روش شیء گرایی روش دیگری وجود نداره.

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

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

vcldeveloper
پنج شنبه 11 مهر 1387, 17:40 عصر
چون همه ++C و Java رو به اسم شیء گرا می شناسند و تمامی مطالب موجود در شیءگرایی در اونها قابل پیاده سازی هست ولی همونطور که شما اشاره کردین میشه در این زبانها برخی قوانین رو نقض کرد. پس این زبانها همگی شیء گرا هستن ولی کاملا" و یا به اصطلاح درست تر به درستی شیء گرا نیستن. ولی در زبانهای تحت دات نت باز هم در تصدیق مطالب شما فقط باید از شیء گرایی استفاده کرد و در اون هیچ قانون و تبصره ای برای روشهای غیر شیء گرایی وجود نداره بنابراین زبانهای دات نتی زبانهای True Object Oriented هستن که شما در اونها خیالتون راحته که جز روش شیء گرایی روش دیگری وجود نداره.
اینطور نیست، شما در جاوا نمی تونید کدی خارج از کلاس بنویسید. جاوا یک زبان Hybrid نیست، بلکه مثل #C فقط امکان استفاده از شی گرایی را فراهم میکنه.

اصل جواب من به این جمله بود:


زبانهای دیگر برنامه نویسی غیر دات نتی فقط نام شیء گرا را با خود یدک میکشن. درسته که این زبانها امکانات زیادی از برنامه نویسی شیء گرا رو دارن ولی برخی از قوانینشون هم با اصل برنامه نویسی شی گراء تضاد داره.
با توجه به توضیحاتی که دادم، زبان های بسیاری هستند که شی گرایی را کاملا پیاده سازی کردند، چه Hybrid، چه مطلقا شی گرا. و جمله شما که "فقط نام شی گرا را با خود یدک میکشند" اشتباه هست. زبان های غیر دات نتی بسیاری وجود دارند که کاملا بر مبنای شی گرایی بنا گذاشته شدند، مثل جاوا یا smalltalk. زبان های زیادی هم هستند که شی گرایی را به شکل کامل ارائه می کنند، ولی به دلایلی انتخاب روش را برعهده برنامه نویس می گذارند. یکی از دلایلش نگهداری کدهای قدیمی تری هست که با این زبان ها نوشته شده و امکان تبدیل آنها به کدهای شی گرا وجود نداره. یکی دیگه از دلایلش میتونه شی گرا نبودن APIهای سیستم عامل هایی مثل ویندوز باشه. برای همین در زبان هایی مثل دلفی از یک طرف کتابخانه شی گرایی به نام VCL در اختیار برنامه نویس قرار میگیره که بخش های مهم و پرکاربرد APIهای ویندوز را Wrap کرده، از طرفی به برنامه نویس اجازه داده میشه که اگر قصد داره مستقیما با این APIها درگیر بشه، خودش کدهای خودش را بنویسد.
پس این تصور که تا قبل از ارائه دات نت زبان های برنامه نویسی دنیا محروم از یک زبان کاملا شی گرا بودند، تصور اشتباهی هست.

نکته دیگه مطرح شده مربوط به این بخش از پست شما بود:

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


من ادعایی مبنی بر داشتن دانش کافی ندارم به همین منظور هم در این سایت عضو شدم تا بتونم با کمک همه دوستان اطلاعاتم رو به روز کنم و اگر هم چیزی می دونم در اختیار دیگران قرار بدم. ولی این باعث نمی شه که بعضی افراد که ممکنه اطلاعات بیشتری داشته باشن قصد تمسخر بعضی دیگه رو داشته باشن و با اصطلاحاتی مثل (عجب!) جوابشون رو بدن. چون در اینجا همه حرمت دارن و هر کس بنا به سطح علمی خودش به سوالها جواب میده.
من قصد تمسخر کسی را نداشتم، ولی وقتی شما یک جمله خبری مثل این را می نویسید:
"زبانهای دیگر برنامه نویسی غیر دات نتی فقط نام شیء گرا را با خود یدک میکشن." برای من واقعا عجیب هست. اون "عجب" نه از سر تمسخر، بلکه از سر تعجب گفته شد، چون اولین باری هست که می بینم کسی همچین ادعایی درباره دات نت میکنه. اگر هدف مسخره کردن بود، نیازی نبود که بعدش یک صفحه هم توضیحات بنویسم.
در فضای بحث علمی طبیعی هست که افراد نظرات یکدیگر را زیر سوال ببرند و از آن انتقاد کنند، اگر قرار باشه هر ایرادی که از یک نظر فنی گرفته میشه = ایرادی بر شخصیت فرد اظهار نظر کننده تصور بشه، دیگه هیچ کس نباید اظهار نظر بکنه، چون هر اظهار نظری نهایتا به ضد و خورد ختم میشه.

موفق باشید

hanieh66
پنج شنبه 11 مهر 1387, 17:48 عصر
ممنون. من جوابمو گرفتم

#Laser
پنج شنبه 11 مهر 1387, 18:02 عصر
توضیحات شما کامل بود.
من هم از جمله مناسبی استفاده نکردم و منظور من از این جمله که (اسم شیء گرایی رو
یدک می کشند) ضعف زبانهای غیر دات نتی نبوده و صرفا" منظورم (فقط شیء گرایی نبودن) زبانهای دیگه بوده.

به هر صورت من هم راجع به زبانهای Hybrid چیزی نمی دونستم و این مطالب باعث شد
تا راجع به این نوع هم بیشتر تحقیق کنم.

اَرژنگ
چهارشنبه 17 مهر 1387, 14:31 عصر
به زبان ساده شما نمی تونین والد یک شیی به ارث رسیده رو به راحتی پبدا کنین
راحتی را از چه لحاظ تعریف شده میدانید؟ مگر پیدا کردن والدهایه آدمها (که از ۲ نفر ارث بری میکنند) سخت است؟

اَرژنگ
چهارشنبه 17 مهر 1387, 15:02 عصر
سلام :

باید خدمت شما عرض کنم که دات نت طراحی شد تا علاوه بر امکانات زیاد برنامه نویسی به ما این امکان رو بده که در اون به درستی از Object Oriented استفاده کنیم و به همین دلیل به زبانهایی که با این تکنولوژی کار میکنن True Object Oriented گفته می شه یعنی تمامی قواعد و قوانین برنامه نویسی شیء گرا در دات نت به درستی رعایت شده .
بنابراین باید بدونیم که اصل برنامه نویسی شیء گرا همین چیزی هست که در دات نت پیاده سازی شده. زبانهای دیگر برنامه نویسی غیر دات نتی فقط نام شیء گرا را با خود یدک میکشن. درسته که این زبانها امکانات زیادی از برنامه نویسی شیء گرا رو دارن ولی برخی از قوانینشون هم با اصل برنامه نویسی شی گراء تضاد داره.
پس به جای اینکه از خودمون بپرسیم چرا در دات نت ارث بری چندگانه وجود نداره باید بپرسیم چرا در زبانهای دیگر غیر دات نتی که شیء گرا هستن می شه از چند کلاس ارث برد ؟

برنامه نویسی شیء گرا از طبیعت و محیط اطرافمون الهام گرفته شده. بنابراین هر موجودی دارای یک والد هست و از یک شاخه مشتق می شه. ولی برخی موجودات با شاخه های ارث بری متفاوت دارای اشتراکاتی هستن. مثلا" انسان و ماشین دو شیء با شاخه های ارث بری متفاوت هستن ولی هر دو دارای این خاصیت مشترک هستن که می تونن حرکت کنن.
به همین دلیل در دات نت Interfaceها وجود دارن که بتونیم بین بعضی اشیاء که از دو والد جدا از هم مشتق شدن ولی اشتراکاتی دارن ارتباط خویشاوندی مجازی بوجود بیاریم.
در واقع این هم یکجور ارث بری چندگانه هست ولی با تعریف و استفاده درست.
چون در دات نت فقط میشه از یک کلاس ارث برد ولی میشه بی شمار Interface رو Implement کرد.
امیدوارم توضیحاتم کامل و قانع کننده بوده باشه.
توضیحاتتان یکمقداری مبانیش کامل نیست.
ا) اینکه هر موجودی یک والد دارد درست نیست، با قاطی کردن کدهایه ژنتیک میشه چیزهایی را که با هم ربط ندارند را قاطی کرد.
۲)نه تنها برنامه نویسی بلکه همه چیز دیگر در زندگی معمولی از طبیعت و محیط اطرافمون الهام گرفته.
۳)برنامه نویسی هدفش ساختن مدل است. مدلسازی اصلش در فلسفه شروع شد و کمبودها و یادگیری اصلیش هم به فلسفه برمیگرده.
۴)برنامه نویسی شئیگرا، دات نت، و یا هر زبان برنامه نویسی یا فریم ورکی بدست کسانی طراحی و پیاده سازی شده که در نظرشان روش مدلسازی را به اینکه چه خصوصیاتی باید داشته باشد و یا اینکه با چقدر مشکلات میارزه که چه قابلیتهایی در زبانی و یا فریم پیاده کنند. اینکه ارث بری چندینگی در دات نت نیست ، دلیل اساسی ندارد، و میشه بنابر دلایلی داشت و یا نداشتش. یک فریم ورک درست حسابی قابلیت داشتن و یا نداشتن ارث بری چندینگی را به کاربرش (برنامه نویس) واگذار میکنه (نه اینکه از داشتنش جلوگیری کند).