نمایش نتایج 1 تا 11 از 11

نام تاپیک: #s

  1. #1

    Tick #s

    با سلام به همه
    چند ریختی یاpolzmorphismچیست؟

  2. #2
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    polymorphism یا چند شکلی به این معنی هست که یک شی از کلاس مشتق شده بتونه در مواقعی که به شی ایی از کلاس پایه نیاز هست، همانند شی کلاس پایه عمل کنه.
    برای مثال:

    #include<iostream.h>
    class car
    {
    public:
    int weight;
    float speed()
    {
    return 30.5;
    }
    };
    class sportcar:public car
    {
    int color;
    };
    void show(car);
    void main()
    {
    sportcar obj;
    show(obj);
    }
    void show(car obj)
    {
    cout<<obj.speed()<<endl;
    }

    توی این مثال کلاس sportcar از کلاس car مشتق شده. و تابع speed از کلاس پایه به sportcar به ارث رسیده. تابع show در اینجا پارامتری از کلاس car میگیره و مقدار speed از اونو چاپ میکنه. در main شی ای از کلاس sportcar ساختم و به تابع show فرستادم در حالی که در prototype تابع show تعریف کرده بودم که شی ایی از کلاس car دریافت کنه. با اجرای این برنامه مشکلی پیش نمیاد علتش هم همین بحث polymorphism یا چند شکلی ها هست که یک شی از کلاس مشتق شده میتونه مثل یه شی کلاس پایه عمل کنه چون تمام خصوصیت های کلاس پایه رو در خودش داره. این مثالی که زدم فقط برای آشنایی بود ولی در اصل چند شکلی ها رو با توابع مجازی به کار می برن که نقش مهم تری رو تو این زمینه ایفا میکنن.
    ضمنا وقتی که تاپیک به جوابی که میخواین رسید دکمه تایید گفتگو رو بزنید نه همون اول که تاپیک رو ساختین.

  3. #3
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    عماد جان فکر میکنم که یه کمی تعریف شما مشکل داره و بیشتر مربوط به مطلب وراثت و روابط پدر و فرزند میشه.
    در حقیقت اگر بخواهیم polymorphism رو تعریف کنیم از روی معنای لغویش میشه بهش پی برد یعنی چند ریختی. حالا این چند ریختی چی هست؟
    شما فرض کن که یه کلاس پایه داری به اسم shape که این کلاس یه متد داره به اسم Draw حالا شما کلاس های دیگه ای از این کلاس مشتق میکنی مثل rectangle , ellipse که هر دوی این کلاس ها متد draw رو برای خودشون بازنویسی میکنن. حالا وقتی شما از این کلاس ها نمونه درست میکنید فقط کافیه برای رسم شکل متد draw رو صدا بزنید در این حالت میبینید که این متد یک بار مستطیل و بار دیگه بیضی رسم میکنه. با این که یک اسم داره ولی چند حالت یا چند شکل مختلف داره.
    موفق باشید.

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    با این که یک اسم داره ولی چند حالت یا چند شکل مختلف داره.
    ما میتونیم چند تابع با نام یکسان داشته باشیم که هر کدوم هم به یه شکلی عمل کنن ولی به اونا چند شکلی نمیگن. در خود کلاس ها هم میشه چند تابع با نام یکسان تعزیف کرد و در کلاس مشتق شده override کرد ولی چند شکلی معمولا با توابع مجازی پیاده سازی میشه. مثالی که شما زدین کاملا درسته ولی میشه توابع رو جوری نوشت که احتیاج به virtual نباشه. و نکته دیگه ای هم که قابل ذکر هست و رفتار چند شکلی بودن رو نشون میده اینه که توی چند شکلی ها و توابع مجازی یک تابع که اشاره گر یا ارجاعی به کلاس پایه دریافت میکنه و در برنامه قرار میدن و تمام اشایی که از کلاس های مشتق شده رو می سازن به این تابع می فرستن در واقع مهم اینه که اشاره گر کلاس پایه به کلاس مشتق شده تابع مورد نظر رو فراخوانی که در غیر این صورت دیگه نمیشه گفت چند شکلی(فکر میکنم منظور شما هم همین باشه) .در کل به نظرم چند شکلی رفتاری هست که یک شی از خودش بروز میده .در مورد مثال قبل هم حق با شماست اشتباه کردم باید به این صورت می نوشتم:

    #include<iostream.h>
    class car
    {
    public:
    int weight;
    virtual float speed()
    {
    return 30.5;
    }
    };
    class sportcar:public car
    {
    public:
    float speed()
    {
    return 40;
    }
    };
    void show(car *);
    void main()
    {
    sportcar obj;
    show(&obj);
    }
    void show(car *obj)
    {
    cout<<obj->speed()<<endl;
    }

  5. #5
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    ما میتونیم چند تابع با نام یکسان داشته باشیم که هر کدوم هم به یه شکلی عمل کنن ولی به اونا چند شکلی نمیگن.
    دقیقا به این میگن چند شکلی.
    نام کتاب: برنامه نویسی شی گرا
    نویسنده: آنتونی سنتیس ترجمه: عباس ریاضی، مهدی بنوازی
    انتشارات نص
    فصل 6 صفحه 122
    واژه جدید:
    چند شکلی بودن یعنی اینکه یک موجودیت، دارای اشکال مختلفی باشد. این موضوع در اصطلاح برنامه نویسی یعنی با استفاده از یک نام واحد بتوان رفتارهای مختلفی را در شرایط مختلف، آن هم به صورت خودکار، انتظار داشت.
    در خود کلاس ها هم میشه چند تابع با نام یکسان تعزیف کرد
    تو همه کلاس ها میشه چند تابع هم نام داشت ولی به شرطی که در تعداد یا نوع پارامتر ها با هم تفاوت داشته باشن که به این هم میگن چندشکلی بودن پارامتری.
    چند شکلی معمولا با توابع مجازی پیاده سازی میشه
    ولی میشه توابع رو جوری نوشت که احتیاج به virtual نباشه.
    فرمایش شما کاملا متینه .
    در ضمن به نظر این حقیر مثال اول که زدید بهتر بود. در مثال دوم که زدید درسته که هر دو کلاس دو متد با یک نام داشتن که یکی 40 و دیگری 30.5 رو برمیگردوند ولی اگر دقت کنید دو کلاس دقیقا با یک نوع داده یک کار مشخص انجام میدهند یعنی نمایش سرعت که اینجا چند شکلی استفاده نداره یعنی اصلا چند شکلی نیست شما در هر صورت مقدار سرعت رو نمایش میدی که هر دو هم از یک نوع هستن مگر اینکه منظور شما برگردوندن انواع مختلف باشه یعنی int, float.
    زمانی از چند شکلی استفاده میشه که یا در تعداد ورودی ها، یا در نوع ورودی ها، یا در نوع بازگشتی یا در عملی که روی ورودی ها انجام میشه تفاوت وجود داشته باشه.
    در دو مورد اول میشه توابع هم نام داخل یک کلاس داشت ولی در دو نوع دیگه یعنی اگر توابع هم نام بودن، تعداد ورودی ها یکسان بود و نوع ورودیها هم یکی بود و تفاوت توابع فقط در نوع بازگشتی یا عملیاتی که روی آن انجام می شود بود توابع باید در کلاس های متفاوتی باشند.
    موفق باشید.

  6. #6
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    تو همه کلاس ها میشه چند تابع هم نام داشت ولی به شرطی که در تعداد یا نوع پارامتر ها با هم تفاوت داشته باشن که به این هم میگن چندشکلی بودن پارامتری.
    مثلا فرض کنید توی کلاس پایه یه تابع و تو کلاس مشتق تابعی به همون نام و همون تعداد پارامتر داریم. با این اوصاف آیا این مورد امکان داره که 2 تابع هم نام و هم پارامتر داشته باشیم؟ بنده میگم امکان داره.
    ضمنا وقتی چند تابع داریم که نام یکسانی دارن و پارامتر های مختلفی میگیرن میگن سربار گذاری کردن توابع و ربطی به چند شکلی نداره.
    زمانی از چند شکلی استفاده میشه که یا در تعداد ورودی ها، یا در نوع ورودی ها، یا در نوع بازگشتی یا در عملی که روی ورودی ها انجام میشه تفاوت وجود داشته باشه.
    اینم باز میشه همون overload کردن متد ها. در چند شکلی ها دقیقا توابع هم نام و هم پارامتر هستند چون از کلاس پایه به ارث برده شده اند. در همین مثالی که خودتون برای کلاس پایه shape زدین آیا تابع draw از هر شی پارامتر های مختلفی دارن؟ در اصل نباید این طور باشه. در مورد مثال دومی که زدم اگه دقت کنید تا زمانی که تابع مجازی تعریف نشده تابع speed از کلاس پایه یعنی car فرخوانی میشه ولی با مجازی کردن تابع، تابع speed از کلاس sportcar فراخوانی میشه. تابع show اشاره گری به کلاس car دریافت میکنه ولی تابع با شی ایی از کلاس sportcar فراخوانی شده هست اینجاست که چند شکلی معنی پیدا میکنه.
    در واقع شما چند شکلی رو در توابع می بینی ولی من میگم چند شکلی رفتاری از یک شی هست که در مواقعی مثل همین مثال میتونه جای شی کلاس پایه عمل کنه.

  7. #7
    کاربر تازه وارد آواتار amir_paia
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    تهران
    سن
    34
    پست
    50
    هر دو عماد و علیرضا درست میگن. فکر می کنم که چیزی که علیرضا میگه overload و چیزی که عماد میگه polymorphism. که اورلود جزیی از پلی مرفیسم هستش. اگه درست میگه تایید کنید.

  8. #8
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    مثلا فرض کنید توی کلاس پایه یه تابع و تو کلاس مشتق تابعی به همون نام و همون تعداد پارامتر داریم. با این اوصاف آیا این مورد امکان داره که 2 تابع هم نام و هم پارامتر داشته باشیم؟ بنده میگم امکان داره.
    خوب این حرف رو دقیقا من هم ولی فکر میکنم که شما متن رو کامل نخوندید.
    ولی در دو نوع دیگه یعنی اگر توابع هم نام بودن، تعداد ورودی ها یکسان بود و نوع ورودیها هم یکی بود و تفاوت توابع فقط در نوع بازگشتی یا عملیاتی که روی آن انجام می شود بود توابع باید در کلاس های متفاوتی باشند.
    مثالی هم که شما گفتید دقدقا ذکر کردید که تو کلاس پدر و کلاس فرزند که این باز هم خودش میشه دوتا کلاس متفاوت.
    اینم باز میشه همون overload کردن متد ها.
    عماد جان به نظر من یکی از این شرایط باید وجود داشته باشه که پلیمورفیسم معنی پیدا کنه و اگر هیچ کدوم از این شرایط برقرار نباشه یعنی دوتا تابع داشته باشیم که تعداد ورودی هاشون یکسان باشن و نوع ورودی ها هم یکی باشن و عملی هم که انجام میدن یکی باشن و نوعی که برمیگردونن هم یکی باشه در این صورت این دوتا تابع یکی هستن نه دوتا و اگر تو دوتا کلاس این توابع تعریف بشن نقض اصول شی گرایی هست.
    هر دو عماد و علیرضا درست میگن. فکر می کنم که چیزی که علیرضا میگه overload و چیزی که عماد میگه polymorphism.
    همونطور که میدونید شی گرا و مسائل مربوط یه اون یک تئوری بود. بعد وقتی در تئوری موفق شد شروع به پیاده سازی اون در دنیای برنامه نویسی شد. برای هریک از قسمت های شی گرا هم راه کار های متفاوتی ارائه شد. مثلا یکی از راه کار هایی که برای پلیمورفیسم ارائه شد overload بود. حالا اینکه وقتی من تو مثال برای بیان دقیق تر تعریف از این امکان استفاده میکنم دلیل بر این نمیشه که من کل پلیمورفیسم رو تو overload کردن خلاصه میکنم.
    من تعریف رو با استفاده از منبع بیان کردم بعد سعی کردم با مثال کمی روشن تر بشه.
    خودم تو این سایت چه از اساتید مثل Inprise چه از بقیه دوستان خیلی چیزا یاد گرفتم. اگر هم چیزی بلد بودم سعی کردم در اختیار دوستان قرار بدم. تو این زمینه هم چون موضوع یکی از پروژه های دانشگاهیم بود یه چیزایی میدونستم سعی کردم در اختیار دوستان قرار بدم ولی اینقدر پافشاری روی یک موضوع ...
    موفق باشید.

  9. #9
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    عماد جان به نظر من یکی از این شرایط باید وجود داشته باشه که پلیمورفیسم معنی پیدا کنه و اگر هیچ کدوم از این شرایط برقرار نباشه یعنی دوتا تابع داشته باشیم که تعداد ورودی هاشون یکسان باشن و نوع ورودی ها هم یکی باشن و عملی هم که انجام میدن یکی باشن و نوعی که برمیگردونن هم یکی باشه در این صورت این دوتا تابع یکی هستن نه دوتا و اگر تو دوتا کلاس این توابع تعریف بشن نقض اصول شی گرایی هست.
    منظور من این بود که نام و تعداد پارامتر های توابع یکی هست ولی پیاده سازی های مختلفی دارن. مثل همون مثال تابع draw ولی این رفتار رو میشه با توابع مجازی پیاد سازی کرد.
    تو این زمینه هم چون موضوع یکی از پروژه های دانشگاهیم بود یه چیزایی میدونستم سعی کردم در اختیار دوستان قرار بدم ولی اینقدر پافشاری روی یک موضوع ...
    دوست عزیز از پافشاری های من ناراحت نشین. من اصلا نمیخوام حرف شما رو نقض کنم و به احتمال زیاد مشکل هم از منه. فقط میخوام که مفهوم رو درست بفهمم. من از کتاب دیتل C++‎ رو خوندم و در این کتاب هم بحث چند تابع هم نام رو به عنوان overloading ذکر کرده. در فصل چند شکلی ها هم به این صورت نوشته:
    چند شکلی از طریق توابع virtual پیاده سازی می شود. هنگامی که در خواست استفاده از توابع virtual از طریق اشاره گر(یا ارجاع) کلاس پایه داده میشود C++‎ تابع صحیح هم پوشانی شده را در کلاس مشتق شده مرتبط با آن شی انتخاب میکند.
    اگر تابع عضو از طریق اشاره گر کلاس مشتق شده احضار شود نسخه کلاس مشتق شده مورد استفاده قرار میگیرد.این یک رفتار غیر چند شکلی است.
    در واقع تو این کتاب مهم اینه که اشاره گر کلاس پایه تابع کلاس مشتق شده رو فرخوانی کنه. و در واقع این رفتار از شی رو چند شکلی بودن میدونه.
    در جایی هم توی کتاب آقای هاشمیان برای C#‎ که فکر میکنم شما هم دیده باشین این کتاب رو نوشته شده بود که:
    چند شکلی بودن به این معنی است که یک شی از کلاس مشتق شده بتواند در مواقعی که به یک شی از کلاس پایه نیاز است، همانند شی ای از کلاس پایه عمل کند.
    توی این دو تا کتابی که من دیدم چند شکلی رو جزء رفتار یک شی می دونستن. ولی این طور که من از صحبت های شما بر داشت کردم، شما چند شکلی رو در رفتار توابع می دونید.
    به بازم معذرت میخوام که یه کم کش پیدا کرد.
    با تشکر

  10. #10
    polymorphism معانی و انواع مختلفی دارد (parametric polymorphism ، Ad-hoc polymorphism ، در OOP و Non-OOP)که در طی سال های مختلف توسط افراد مختلف اضافه شده اند و برای زبان های مختلف معانی مختلفی می تواند داشته باشد و به همین خاطر در هر کتابی به یکی از آنها اشاره شده است ، یعنی گفته هر نفر ، به شکلی درست است ، برای تعاریف آن به مقالات زیر مراجعه کنید:

    http://searchsmb.techtarget.com/sDef...212803,00.html
    http://encyclopedia2.thefreedictionary.com/polymorphism
    http://www.hotscripts.com/Detailed/70333.html

  11. #11
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    من اصلا نمیخوام حرف شما رو نقض کنم و به احتمال زیاد مشکل هم از منه. فقط میخوام که مفهوم رو درست بفهمم. من از کتاب دیتل C++‎ رو خوندم و در این کتاب هم بحث چند تابع هم نام رو به عنوان overloading ذکر کرده.
    مشکل از هیچ کدوم نیست. همونطور که خودتون گفتید این مطالب رو تو کتاب هایی خوندید که مربوط به برنامه نویسی بودن و تو این کتاب ها غالبا توضیح مسائل رو با توجه به روش پیاده سازی بیان میکنن. برای مثال هموطور که برای چند تابع هم نام به اونها overloading گفته شده.
    ولی اگر به تئوری این موضوع نگاه کنیم یعنی اصلا قبل از اینکه این پلیمورفیسم تو زبان های برنامه سازی پیاده سازی بشن تو تعریف و تئوری اگر توابع همنامی وجود داشته باشه که کارهای مختلفی انجام بده به اون میگن پلیمورفیسم.
    بعضی از کتاب ها که فقط به تشریح مسائل و تئوری بدون در نظر گرفتن چگونگی پیاده سازی پرداختن، اصلا از اصطلاحات برنامه نویسی برای تشریح مسائل استفاده نکردن که باعث بوجود آمدن اختلاط بین مفاهیم یک تئوری و روش پیاده سازی بشه.
    مثلا برای پلیمورفیسم از مثال انسان چند شخصیتی استفاده شده و گفتن پلیمورفیسم مثل انسان چند شخصیتی میمونه که براساس شرایط مختلف شخصیت های متفاوتی از خودش نشون میده.
    حالا با این تعریف اومدن تو زبان های مختلف امکانات مختلفی برای پیاده سازی گذاشتن مثلا در مورد overloading اگر دقت کنیم میبینیم که دقیقا چیزی هست که تو تعریف تئوری اومده یعنی تابعی با یک نام(همون انسان) در شرایط مختلف کارهای مختلفی انجام میده(شخصیت های مختلفی بروز میده) و من فکر میکنم با توجه به تعریف overloading دقیقا یکی از روش های پیاده سازی پلیمورفیسم باشه.
    و در کل هر امکانی که تو زبان های برنامه نویسی وجود داشته باشه و به ما مثلا امکان پیاده سازی چند تابع با یک نام و عملکرد متفاوت بده در تعریف پلیمورفیسم قابل قبول هست.
    موفق باشید.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •