تمام سوالات سوالات بدون پاسخ سوال بپرسید

سلام به همگی،
Polymorphism چه معنایی داره؟
میشه بطور خاص مثالی از C++ بزنید؟

همین عنوان رو توی گوگل بزنید جواب‌های قابل قبولی می‌گیرین.

(04 آوریل '12, 11:56) ir01 ♦♦
1 پاسخ

سلام دوست عزیز
Polymorphism به معنی چند ریختی یا چند شکلی است و در زبانهای برنامه نویسی هم با همین مفهوم تعریف شده است.
Polymorphism در بسیاری از زبانها مانند خانواده C و همچنین زبانهای متن بازی مانند java و php پیاده سازی شده.
به این مثال توجه کنید:
کلاسی به نام "door" تعریف میکنیم که دارای 2 متد به نامهای "open" و "close" میباشد.
این دَر ممکن است دَر هواپیما باشد یا دَر بطری نوشابه،گرچه هیچ ارتباطی با یکدیگر ندارن اما هردو رفتاری به نامهای باز شدن و بسته شدن را انجام میدهند.
حال ما کلاسی تعریف میکنیم و آنرا از کلاس door ارثبری میکنیم.
کلاس جدید ما باید 2 متد open و close را داشته باشد،اما پیاده سازی کاری که متدها انجام میدهند میتواند در کلاسهای مختلف متفاوت باشد.
مثال بهتر این است که ما یک اداره را در نظر بگیریم که در فرایند اداری مربوط به کارکنان،رفتارهایی را تعریف کرده است.
یک کارمند دارای ساعات ورود و خروج است،وظایفی دارد و حقوق دریافت میکند.
حال ما کلاس مدیر را از کلاس کارمند ارثبری میکنیم و چون وظایف و حقوق مدیر با کارمندان دیگر متفاوت است،
متد وظیفه را با رفتار امضای پرونده ها و متد دریافت حقوق را با مبلغ 10000000 ریال پیاده سازی میکنیم.
کلاسی برای منشی تعریف و از کلاس کارمند ارثبری میکنیم.
متد وظایف را بر اساس وظایف منشی و متد دریافت حقوق را با مبلغ 3000000 ریال پیاده سازی میکنیم.
و به همین صورت کارمندان دیگر را با توجه به رتبه و مقام پیاده سازی میکنیم.
به این صورت ما کلاسی را با متدهای مورد نیاز تعریف میکنیم و در موارد لازم از آن ارثبری کرده و متدهای
مورد نظر را پیاده سازی میکنیم.
در نتیجه این مثال میتوان گفت یک حسابدار تمام رفتارهای یک کارمند را دارد و فقط میزان و نوع این رفتارها متفاوت است.
یک مثال به زبان c++:

class Employee {
public:
  Employee(string theName, float thePayRate);

  string getName() const;
  float getPayRate() const;

  float pay(float hoursWorked) const;

protected:
  string name;
  float payRate;
};

در اینجا یک نمونه را تعریف میکنیم:

Employee::Employee(string theName, float thePayRate)
{
  name = theName;
  payRate = thePayRate;
}

string Employee::getName() const
{
  return name;
}

float Employee::getPayRate() const
{
  return payRate;
}

float Employee::pay(float hoursWorked) const
{
  return hoursWorked * payRate;
}

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

#include "employee.h"

class Manager : public Employee {
public:
  Manager(string theName,
          float thePayRate,
          bool isSalaried);

  bool getSalaried() const;

  float pay(float hoursWorked) const;

protected:
  bool salaried;
};

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

Manager::Manager(string theName,
                 float thePayRate,
                 bool isSalaried)
  : Employee(theName, thePayRate)
{
  salaried = isSalaried;
}

bool Manager::getSalaried() const
{
  return salaried;
}

float Manager::pay(float hoursWorked) const
{
  if (salaried)
    return payRate;
  /* else */
  return Employee::pay(hoursWorked);
}

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

1

البته باید در کلاس پدر برای توابعی که می خواهیم چندریختی دیده شوند کلمه کلیدی virtual را استاده کنیم در مثال بالا باید در کلاس Employee قبل از تابع pay کلمه virtual را قرار دهیم.

(08 آوریل '14, 12:13) hdeldar
toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

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


توسط RSS:

پاسخها

پاسخها و نظرها