PDA

View Full Version : مفهوم Overloading در کلاس



c_doost
یک شنبه 11 فروردین 1392, 20:51 عصر
سلام

Over loadin یعنی چه و چه کار بردی در کلاس ها دارد؟

esafb52
یک شنبه 11 فروردین 1392, 21:17 عصر
سلام دوست عزیز یه کم سرچ کن
یعنی سر بارگذاری
یعنی اگه چند متد داریم که کار مشابه ای انجام میدن با یک نام نامگذاری کنیم ولی با تعداد و نوع پارامترهای مختلف !!!!کامپلیر با توجه به تعداد و نوع پارامترها خودش متد مربوطه رو اجرا میکنه
اگه متوجه نشدی بگو مثال بزنم
2- کابردش اینه که کد رو خواناتر میکنه

c_doost
شنبه 17 فروردین 1392, 19:27 عصر
سلام دوست عزیز یه کم سرچ کن
یعنی سر بارگذاری
یعنی اگه چند متد داریم که کار مشابه ای انجام میدن با یک نام نامگذاری کنیم ولی با تعداد و نوع پارامترهای مختلف !!!!کامپلیر با توجه به تعداد و نوع پارامترها خودش متد مربوطه رو اجرا میکنه
اگه متوجه نشدی بگو مثال بزنم
2- کابردش اینه که کد رو خواناتر میکنه


من از کاربردش میخوام بدونم لطفا مثال بزنین

بدونOver loadin هم میشه کار خودمونو انجام بدیم جز خوانایی برنامه مزیت دیگه ای نداره؟
تشکر

fakhravari
شنبه 17 فروردین 1392, 19:37 عصر
public void add()
{
}
public void add(int a)
{
}
public void add(int a,string g)
{
}

esafb52
شنبه 17 فروردین 1392, 20:53 عصر
کابردش پست بالاست مثل سه تا متد داریم ولی کار های مشابه ایی انجام میدن با یک اسم و پارمترهای متفاوت
بله میشه
فکر نکنم خیر(البته تا جایی که من میدونم)

C#‎_best_Programmer
شنبه 17 فروردین 1392, 21:19 عصر
overloading تو ارث بری یعنی تغییر رفتار متدی از کلاس پایه در کلاس مشتق شده

linux
شنبه 17 فروردین 1392, 21:51 عصر
overloading تو ارث بری یعنی تغییر رفتار متدی از کلاس پایه در کلاس مشتق شده

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

hunter_ara
شنبه 17 فروردین 1392, 22:28 عصر
public void add()
{
}
public void add(int a)
{
}
public void add(int a,string g)
{
}

این یعنی polymorphism یا چند ریختی یا چند شکلی!
اصطلاحا میگن تابع add (در بالا) ۳ overload داره!


overloading تو ارث بری یعنی تغییر رفتار متدی از کلاس پایه در کلاس مشتق شده

firststep
شنبه 17 فروردین 1392, 22:37 عصر
بهترین مثال اگه توی کنسول نگاهی بندازین به go to refrence متد write متوجه می شین که چندین بار تعریف شده
برای هر نوع ورودی یک تعریف و جود داره

c_doost
سه شنبه 27 فروردین 1392, 18:10 عصر
بهترین مثال اگه توی کنسول نگاهی بندازین به go to refrence متد write متوجه می شین که چندین بار تعریف شده
برای هر نوع ورودی یک تعریف و جود داره


من کاربردشو متوجه نشدم در اون تابع میتونیم فقط public void add(int a,string g) داشته باشیم و نیازی به اون خط بالا نیست

wolf_majid
سه شنبه 27 فروردین 1392, 18:51 عصر
ببینن دوست عزیز
فرض کن یک متد داری به نام Add که کارش جمع کردنه و خروجیش رشتست (البته این فقط یک مثاله)
حالا می توانیم فرضا" 30 متد با ورودی های متفاوت با نام Add طراحی کنیم که مثلا" یکیش 2 رشته را جمع می کنه , یکیش 2 int رو جمع میرنه , یکیش دو تا عدد مختلط رو جمع میزنه و الی آخر
حالا فرض کن برای این ها می خواستی اسم های متفاوت انتخاب کنی , به نظرت انتخاب 30 اسم که همگی عمل جمع انجام میدند کار سختی نبود ؟

amir_pro
سه شنبه 27 فروردین 1392, 20:06 عصر
سلام

Over loadin یعنی چه و چه کار بردی در کلاس ها دارد؟

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

c_doost
سه شنبه 27 فروردین 1392, 20:37 عصر
ببینن دوست عزیز
فرض کن یک متد داری به نام Add که کارش جمع کردنه و خروجیش رشتست (البته این فقط یک مثاله)
حالا می توانیم فرضا" 30 متد با ورودی های متفاوت با نام Add طراحی کنیم که مثلا" یکیش 2 رشته را جمع می کنه , یکیش 2 int رو جمع میرنه , یکیش دو تا عدد مختلط رو جمع میزنه و الی آخر
حالا فرض کن برای این ها می خواستی اسم های متفاوت انتخاب کنی , به نظرت انتخاب 30 اسم که همگی عمل جمع انجام میدند کار سختی نبود ؟


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

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

بازم از شما ممنونم

esafb52
سه شنبه 27 فروردین 1392, 21:53 عصر
سلام خیلی ساده اس
ببین مثلا متد شو کلاس مسیج باکس 3 بار اورلود شده
MessageBox.Show("sssssssss");
MessageBox.Show("sssssssss", "sssss");
MessageBox.Show("sssssssss", "ssssss", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

wolf_majid
سه شنبه 27 فروردین 1392, 22:01 عصر
اینجوری که من فهمیدم:
یک تابع که یک کار را انجام میده ولی ورودی های متفاوتی داره با یک اسم ذخیره میکنیم که گیج نشیم و با تعداد ورودی ها میتونیم تابع هارو از هم تمایز بدیم

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

بازم از شما ممنونم

به تعداد و نوع ورودی ها بستگی داره
برای مثال هم همونطور که دوستمون گفتن میتونی متد Show از کلاس messageBox را بررسی کنی

amir_pro
چهارشنبه 28 فروردین 1392, 02:41 صبح
یه سوال: آیا آورلود کردن توابع و عملگرها به نوع برگشتی اون توابع و عملگرهام بستگی داره؟

Mahmoud.Afrad
چهارشنبه 28 فروردین 1392, 03:11 صبح
یه سوال: آیا آورلود کردن توابع و عملگرها به نوع برگشتی اون توابع و عملگرهام بستگی داره؟
نه! فقط به تعداد و نوع ورودی ها بستگی داره.
مثال: همون متد add:

int add(Int16 a, Int16 b)
{
return a + b;
}

Int64 add(int a , int b)
{
return a + b;
}

decimal add(decimal a , decimal b)
{
return a + b;
}


اما دو متد همنام که تعداد و نوع ورودیشان یکسان باشه (بدون توجه به خروجیشان) غیر قابل تعریف هستند و خطای زمان کامپایل دریافت خواهید کرد.
مثال: دو متد زیر را نمیتوان در یک کلاس تعریف کرد:

Int64 add(int a , int b)
{
return a + b;
}

// Compile error
double add(int a, int b)
{
return a + b;
}

c_doost
چهارشنبه 28 فروردین 1392, 17:54 عصر
نه! فقط به تعداد و نوع ورودی ها بستگی داره.
مثال: همون متد add:

int add(Int16 a, Int16 b)
{
return a + b;
}

Int64 add(int a , int b)
{
return a + b;
}

decimal add(decimal a , decimal b)
{
return a + b;
}


اما دو متد همنام که تعداد و نوع ورودیشان یکسان باشه (بدون توجه به خروجیشان) غیر قابل تعریف هستند و خطای زمان کامپایل دریافت خواهید کرد.
مثال: دو متد زیر را نمیتوان در یک کلاس تعریف کرد:

Int64 add(int a , int b)
{
return a + b;
}

// Compile error
double add(int a, int b)
{
return a + b;
}


در کد پایین چرا نمیشه؟ بخاطر نوع ورودی؟؟

Mahmoud.Afrad
چهارشنبه 28 فروردین 1392, 21:55 عصر
در کد پایین چرا نمیشه؟ بخاطر نوع ورودی؟؟
چون تعداد ، نوع و ترتیب ورودی و همچنین نام دو متد یکسان هست کامپایلر نمیتونه تفاوت قائل بشه .

overload علاوه بر نوع و تعداد ورودی ، به ترتیب ورودی هم وابسته است.
یعنی درسته نمیشه دو متد زیر را تعریف کرد: int add(int a, Int16 b)
{
return a + b;
}

// Compile error
Int64 add(int a, Int16 b)
{
return a + b;
}
اما با تغییر در ترتیب ورودی ها مشکل برطرف میشه: int add(int a, Int16 b)
{
return a + b;
}

Int64 add(Int16 b , int a)
{
return a + b;
}