PDA

View Full Version : سوال: کمک در مورد مبحث چندریختی



moonDark
چهارشنبه 09 اسفند 1391, 14:44 عصر
سلام
من کتاب c++ سه چهار تا خوندم ولی اصلا نفهمیدم که چند ریختی:شیطان: چیه یا به چه دردی میخوره اگه میشه راهنمایی کنید ممنون میشم:لبخندساده:

farazjalili
چهارشنبه 09 اسفند 1391, 15:24 عصر
سلام عزیز با یک مثال براتون توضیح می دم فرض کنید می خواهید یک برنامه بنویسید که مساحت اشکال را حساب کند ، خوب راه اول برای هر شکل یک تابع درست کنید و با فراخوانی آن مساحت شکل مورد نظر را حساب کند . راه دوم : بیایید بر اساس قوانین شی گرایی و ارٍث بری یک کلاس کلی در نظر بگیرید به عنوان کلاس پایه که ویژگی مشترک اشیا را در ان قرار دارد از جمله ویژگی مشترک اشیا این است که تمام آن ها مساحت و حجم دارند اما مشکلی که پیش می اید این است که طرز حساب کردن (فرمول آنها ) با هم متفاوت است که در این جا چند ریختی کمک می کند یعنی تمام اشکال مساحت دارند اما فرمول آنها فرق دارد .

maktoom
چهارشنبه 09 اسفند 1391, 19:53 عصر
سلام
چند متد با یک نام، که تعداد آرگومانهاشون فرق داره. اینکه فقط نوع آرگومان ها فرق کنه اما تعدادشون ثابت باشه کافی نیست.
حالا دو حالت داره یکی overload کردن و یکی هم override کردن.
overload کردن یعنی توی یه کلاس بیای چنتا متد هم نام با آرگومان های مختلف(از نظر تعداد) تعریف کنیم. بعد وقتی شیئی از این کلاس بسازیم و این متد اون شیئ رو فرابخونیم بنا به تعداد آرگومانی که داخل پرانتز گذاشتیم، یکی از این متدهای همنام اجرا میشن.
override کردن واسه وقتیه که شما یه کلاس رو از یه کلاس دیگه ارثبری انجام میدید. حالا اگه بیاید در کلاس فرزند یه متد که تویه کلاس والد هست رو عینا پیاده کنه. توی این حالت اگه شیئی از این کلاس تعریف بشه و این متد مشترک توی کلاس والد و کلاس فرزند فراخونده بشه متد داخل کلاس فرزند اجرا میشه و اصطلاحا میگن اون متد کلاس والد پنهان شده(خیلی طبیعیه چون شیئی که تعریف شده از کلاس فرزنده یعنی تاکید کردیم خصوصیات فرزند رو می خوایم).
توضیحات مفصل در ویکی پدیای فارسی (http://fa.wikipedia.org/wiki/%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C_% D8%AF%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E 2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C_%D8%B4%DB%8C %E2%80%8C%DA%AF%D8%B1%D8%A7) موجوده.
موفق باشید./

moonDark
پنج شنبه 10 اسفند 1391, 08:39 صبح
پس چند ریختی فقط یه تابعه که در چند کلاس فرزند یک اسم دارن ولی آرگومان هاشون و کاری که انجام میدن فرق داره؟
اگه آره پس چه فرقی با تعریف چند تابع همنام توی همون کلاسا داره؟

maktoom
پنج شنبه 10 اسفند 1391, 15:39 عصر
سلام
دوباره مطالعه بفرمایید.
اول اینکه چند ریختی اسم تابع یا متدی نیست. بلکه یک قابلیت شی گراییه. پس اون رو یک قابلیت بدونید نه یه چیزی مثل متد یا تابع.
و دوم، هر دوی اینهایی که گفتید انوان چند ریختی رو تشکیل میدن. یکی در حالت یک کلاس که بهش overload کردن می گن و دیگری در حالت override کردن که در حالت ارثبری اتفاق میفته.
پس هردوی اینها که گفتید چند ریختی هستند. در حالتهای مختلف.

moonDark
پنج شنبه 10 اسفند 1391, 18:24 عصر
آها .. مرسی ولی خداییش c++ در بین تمام زبان هایی که میشناسم یا بلدم پیچیده ترینه و به نظر من بهترین:خجالت:

maktoom
پنج شنبه 10 اسفند 1391, 20:07 عصر
دوست عزیز، بنده هم تاوقتی جاوا کار نکرده بودم اصلا از شی گرایی درک درستی نداشتم.
سی پلاس پلاس رو توقف نکنید، اما یه زبون هم در کنارش یاد بگیرید که اساسش شی گرایی باشه. اونوقت مفاهیم اصلی شی گرایی رو خوب درک می کنید. بعد وقتی برمیگردید سراغ سی پلاس پلاس راحتتر برنامه می نویسید.

moonDark
جمعه 11 اسفند 1391, 18:26 عصر
من 3 زبان که OOP هم هستن رو بلدم ولی تا حالا از چند ریختی چیز زیادی نفهمیدم و ازش هم زیاد استفاده نکردم

developing
شنبه 12 اسفند 1391, 11:25 صبح
با سلام

شی گرایی در برنامه نویسی با برنامه نویسی شی گرا تفاوتی از زمین تا آسمان دارند

معمولا کسانی که cpp رو توی دانشگاه یاد میگیرن اصلا شی گرا کد نمی نویسن بلکه از شی گرایی در برنامه هاشون استفاده می کنن.

این هم به خاطر بی سوادی اساتید دانشگاه هست.

اما چون جاوا کارها معمولا خودشون به سمت برنامه نویسی پیش میرن و به قول دوستمون در جاوا فقط شی گرا می شه کد نوشت اینه که جاوا کارها شی گرایی رو بیشتر درک می کنند.

دید خودتون رو در مورد شی گرایی تغییر دهید و برنامه هاتون رو شی گرا بنویسید نه اینکه از شی گرایی در برنامه تون استفاده کنید. زبانی که استفاده می کنید مهم نیست.

بطور معمول وقتی برنامه نویسی می نمایید از چند ریختی استفاده ی زیادی نخواهید برد و نیازی هم نیست که چند ریختی را یاد بگیرید اما وقتی در cpp کدی نوشتید که جز تابع main بقیه ی کدها داخل کلاس بلوکه شده بودند آنوقت می شود گفت به سمت شی گرایی قدم برداشته اید.

در این زمان است که چند ریختی به کار خواهد آمد. و با تکرار و تمرین ملکه ی ذهن شما خواهد شد.

در یک کلام ساده : چند ریختی یعنی یک نام با کاربردهای متفاوت و دلخواه که نیازی نیست برای انجام دادن کارهای یکسان نام های متفاوت استفاده کرد.

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

moonDark
یک شنبه 13 اسفند 1391, 21:04 عصر
با سلام

شی گرایی در برنامه نویسی با برنامه نویسی شی گرا تفاوتی از زمین تا آسمان دارند

معمولا کسانی که cpp رو توی دانشگاه یاد میگیرن اصلا شی گرا کد نمی نویسن بلکه از شی گرایی در برنامه هاشون استفاده می کنن.

این هم به خاطر بی سوادی اساتید دانشگاه هست.

اما چون جاوا کارها معمولا خودشون به سمت برنامه نویسی پیش میرن و به قول دوستمون در جاوا فقط شی گرا می شه کد نوشت اینه که جاوا کارها شی گرایی رو بیشتر درک می کنند.

دید خودتون رو در مورد شی گرایی تغییر دهید و برنامه هاتون رو شی گرا بنویسید نه اینکه از شی گرایی در برنامه تون استفاده کنید. زبانی که استفاده می کنید مهم نیست ....

من خودم از شی گرایی خیلی استفاده کردم و تمام زبان هایی که بلدمو خودم یاد گرفتم (سوم دبیرستانم!!:لبخند:) پس چندریختی فقط چند تابع هم اسم در کلاس های مشتق شده نیست؟ میتونه متغییر یا هر چیز دیگه باشه؟ و یه سوال دیگه توابع مجازی دقیقا چه فرقی با بقیه توابع دارن؟
حالا که اینهمه از جاوا تعریف میکنید وسوسه شدم اونم یاد بگیرم!! (برای آندروید خیلی لازم دارم)

developing
چهارشنبه 16 اسفند 1391, 11:20 صبح
با سلام

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

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

توابع مجازی هم ساختار قالب کلاس مجازی رو معین می کنند.

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