View Full Version : سوال: سوالی در باره ی وراثت
programmer90
چهارشنبه 19 خرداد 1389, 19:43 عصر
ببخشین مگه ما در مبحث وراثت نمیگیم وقتی کلاسی از کلاس دیگه مشتق میشه به متد های اون دسترسی داره؟پس چرا بعضی وقت ها ما در کلاس مشتق شده عین اون متد رو که در کلاس پایه هست رو مینویسیم؟
mahdi68
چهارشنبه 19 خرداد 1389, 21:10 عصر
چون بهش دسترسی داریم !!! یا شما منظورتون بد بیان کردین یا من بد متوجه شدم یکم سوالتون واضح توضیح بدین
programmer90
چهارشنبه 19 خرداد 1389, 21:23 عصر
نه ببینین من خوندم که مشتق کردن یک کلاس از کلاس پایه به این معنیه که ما می خوایم دوباره خصوصیاتی که کلاس پایه داره در مشتق شده تکرار نکنیم و ننویسیم چون در واقع اون ها رو به ارث میبره درسته ؟اگه نه پس اگه قراره ما همون متد هایی رو که در کلاس پایه هست رو در مشتق شده تکرار کنیم پس وراثت به چه دردی میخوره؟
mahdi68
چهارشنبه 19 خرداد 1389, 21:36 عصر
هر کلاسی که مشتق میشه یک نگارش ویژه از کلاس اصلی هست که تمام نمونه متغییر ها و متدهای تعریف شده در کلاس اصلی به ارث میبره و اعناصر منحصر بفرد خودش به اون اضافه میکنه
programmer90
چهارشنبه 19 خرداد 1389, 22:06 عصر
class student{
protected long stnum;
protected float grade;
protected String name;
public void getinfo()throws Exception{
name=JOptionPane.showInputDialog("enter student name:");
stnum=Integer.parseInt(JOptionPane.showInputDialog ("enter student number:"));
grade=Integer.parseInt(JOptionPane.showInputDialog ("enter student grade:"));
}
public void showinfo(){
JOptionPane.showMessageDialog(null,name+" "+stnum+" "+grade);
}
public void showTitle(){
JOptionPane.showMessageDialog(null,"name number grade");
}
}
class nightstudent extends student{
private long shahrie;
public void getinfo()throws Exception{
name=JOptionPane.showInputDialog("enter student name:");
stnum=Integer.parseInt(JOptionPane.showInputDialog ("enter student number:"));
grade=Integer.parseInt(JOptionPane.showInputDialog ("enter student grade:"));
shahrie=Integer.parseInt(JOptionPane.showInputDial og("enter student shahrie:"));
}
public void showinfo(){
JOptionPane.showMessageDialog(null,name+" "+stnum+" "+grade);
}
public void showTitle(){
JOptionPane.showMessageDialog(null,"name number grade");
}
}
سوال من اینه nightstudent که مشتق شده از کلاس student ,وقتی قراره متدهاش(getinfoو..)مثل کلاس پایه اش نوشته بشه پس وراثت به چه دردی میخوره؟
mohsensaghafi
چهارشنبه 19 خرداد 1389, 22:21 عصر
سلام دوست عزیز.
این مثالی رو که آوردید، منبعش چیه؟! چقدر به منبعی که ازش این کد رو سند قرار دادید اطمینان دارید.
در مورد ارث بری نیازی به پیاده سازی متد هایی که در کلاس والد هست، نیست. ما فقط متد های مختص کلاس فرزند رو می نویسیم. اما بعضی مواقع، مثل تابع getInfi()، پیاده سازی متد با پیاده سازی متد کلاس والد متفاوت است. در این صورت ما فقط همان متد و متد هایی که چنین خصوصیاتی رو دارن ( تغییر در پیاده سازی) دوباره پیاده سازی می کنیم. بش می گن override یا overloud .
به پیاده سازی متد getinfo دقت کنید.
به نظر من، پیاده سازی دو متد دیگر بر خلاف مباحث شی گرایی است.
programmer90
چهارشنبه 19 خرداد 1389, 22:30 عصر
سلام واقعا ممنونم.مال یه کتاب مشهور فارسیه.فقط یه سوال کجای کد مخالف شی گرایی بود ؟واقعا پاسختون کامل بود بازم ممنون.
programmer90
چهارشنبه 19 خرداد 1389, 23:19 عصر
ما از کجا این override یا overloudها رو بشناسیم؟
jlover
پنج شنبه 20 خرداد 1389, 00:57 صبح
ما از کجا این override یا overloudها رو بشناسیم؟
وقتی در یک زیرکلاس، متدی دقیقاً با همان امضا که در ابرکلاس اومده، آورده میشه و تعریف میشه (و پیاده سازی میشه طبعاً)، گفته میشه که این متد بازنگاری (override) شده.
وقتی کامپایلر/مفسر شروع به کامپایل/اجرای (یا استفاده از) این زیرکلاس میکنه، زمانیکه به یک متد رسید، ابتدا در همون کلاس میگرده تا ببینه اگر تعریفی (بازنگاری ای) موجود هست، از همون استفاده می کنه. اگر اینطور بود، گفته میشه که این متد سربار متد والد شده (overload). اگر تعریف متد در همین کلاس یافت نشد، جستجو رو به صورت بازگشتی در ابر کلاسهای این کلاس ادامه میده تا جایی که به اولین والدی برخورد کنه که این متد رو پیاده سازی/تعریف کرده. در غیر این صورت یک استثنا مبنی بر یافت نشدن متد مورد نظر پرتاب خواهد شد.
programmer90
پنج شنبه 20 خرداد 1389, 10:07 صبح
میشه غیر getinfo() مهم ها رو اسم ببرین که در کلاس مشتق کارش با کلاس پایه فرق داره؟
javaphantom
پنج شنبه 20 خرداد 1389, 17:37 عصر
ما از کجا این override یا overloudها رو بشناسیم؟
در جاوا بشرطی که یک متدود با کلمه کلیدی final بسته نشده باشد. این متدود می تواند در کلاسهای فرزند override شود یعنی رفتار همان بوده که هست اما نوع و طریقه اون فرق می کنه مثلا پروازکردن کاملا در مورد عمل پرواز توصیف می کنه اما نوع و روش اون در هواپیما یک جور و برای مگس طوری دیگر هست. اصل پلی مورفیزم
نکته : در override کردن یک متدود می توان رفتار پدر در فرزند نیز قبل یا بعد از تغییر رفتار در متدود فرزندان رو نیز حفظ کرد.
در صورتیکه چند متدود هم نام اما با ارگومانهای مختلف در یک کلاس وجود داشته باشد یا نیاز داشته باشیم عمل overload صورت گرفته است. اصل پلی مورفیزم
programmer90
پنج شنبه 20 خرداد 1389, 22:00 عصر
سلام از کمک همه ممنونم.واقعا بودن در کنار شما نعمتیه و بودن در این سایت:لبخندساده:
mohsensaghafi
پنج شنبه 20 خرداد 1389, 22:45 عصر
سلام واقعا ممنونم.مال یه کتاب مشهور فارسیه.فقط یه سوال کجای کد مخالف شی گرایی بود ؟واقعا پاسختون کامل بود بازم ممنون.
سلام دوست عزیز.
زمانی که متد ها به هر دلیلی نابجا استفاده، یا پیاده سازی بشه، بر خلاف مفاهیم شی گرایی عمل شده. در این مورد خاص چون بر خلاف مفاهیم ارث بری هست، پس کلا شی گرایی آن زیر سوال می رود.
دوست عزیز، کتابهای فارسی زیاد قابل استناد و اعتبار نیستند. در چنین مواقعی به رفرنس های انگلیسی مراجعه کنید مطالب مفید تری را دریافت خواهید کرد.
programmer90
شنبه 22 خرداد 1389, 19:51 عصر
واقعا ممنونم از همه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.