PDA

View Full Version : سوال: ارث بری



yekta68
پنج شنبه 04 شهریور 1389, 11:48 صبح
سلام به همه (یه کم فوریه اگه می دونین دریغ نکنین لطفا)


من می خوام یه کم در مورد ارث بری بدونم. سوالمو با یه مثال طرح می کنم.فرض کنین من یه کلاس person دارم که سه تا کلاس child و adult و senior ازش مشتق شدن.خب این زیرکلاسا همه فیلدای کلاس پایه رو به ارث می برن.بنابراین من باید فیلدایی رو تو زیرکلاسا بذارم که مختص اون زیرکلاسه خاصه.و مشترکاشون توی همون کلاس پایه است.درسته این زیرکلاسا سنشون با هم فرق داره ولی همشون فیلد سن رو دارن و چیزی که فرق داره صرفا مقدارشونه.چیزی که می خوام ازش سر در بیارم اینه که چیا رو توی این زیرکلاسا قرار بدم.

با تشکر

C Sharp
پنج شنبه 04 شهریور 1389, 12:54 عصر
ببینید ، شی گرایی واسه این استفاده میشه که دامنه مسئله شما رو به اشیاء مختلف و متمایز، چه از نظر عملکرد و چه از نظر خصوصیات ، مدل کنه.

تو یه پروژه ممکنه بچه ، پیر و میانسال باهم هیچ تفاوتی نداشته باشن ، پس نیازی به ارث بری نیست ، ولی ممکنه تو یه پروژه دیگه بسته به نیاز و تعریفی که اون پروژه از اینها داشته باشه ، متفاوت باشن و اونوقته که تفاوتهاشون درون زیر کلاسها قرار میگیره

اگه حس میکنید ممکنه در آینده تو پروژه این 3تا شرایط متفاوتی نسبت به هم پیدا کنن ، میتونید از اول حتی با اینکه تفاوتی ندارن ارث بری کنید و هرجا خواستین بعنوان PERSON پاسشون بدین

پلی مورفیسم رو گذاشتن واسه همین روزا :چشمک:

C Sharp
پنج شنبه 04 شهریور 1389, 13:01 عصر
راستی اینو یادم رفت اضافه کنم :

نمیشه صرف اینکه همشون خاصیت سن رو دارن و دیگه فرقی ندارن ، بگیم نباید ارث بری کرد
میدونی چرا ؟

واسه اینکه اگه دقت کنی ، بچه ها معمولا سنشونو نمیدونن ، سالمندها سنشون رو بیشتر میگن و میانسالها سن واقعیشون

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



class Person
{
protected int _age;

public int Age
{
get { return _age; }
}
public Person(int age)
{
_age = age;
}
}
class Adult : Person
{
public new int Age
{
get { return _age; }
}
public Adult(int age) : base(age) { }
}
class Child : Person
{
public new int Age
{
get { return -1; }
}
public Child(int age) : base(age) { }
}
class Senior : Person
{
public new int Age
{
get { return _age + 2; }
}
public Senior(int age) : base(age) { }
}

yekta68
شنبه 06 شهریور 1389, 08:32 صبح
یه چیز دیگه.اگه همه این زیرکلاسا یه متد مشترک ولی با پیاده سازی متفاوت داشته باشن
می تونم از Abstract Class به جای کلاس معمولی استفاده کنم؟و کلاسای مشتق شده این متد رو از این کلاس override کنن.

C Sharp
شنبه 06 شهریور 1389, 08:43 صبح
بله میتونید ، ولی اگه کلاس پدر فقط و فقط نقش عمومیت بخشی بین زیر کلاسا رو داره ، و هیچ خاصیت دیگه ای نداره ، به نظرم استفاده از اینترفیس بهتره

yekta68
شنبه 06 شهریور 1389, 09:06 صبح
ممنون از راهنماییتون.
--------------------
تو همین بحث inheritance من سه نوع کاربر واسه سیستمم دارم که هر کدوم از اینا مجوزاشون
با هم فرق داره.وقتی login می کنن سیستم باید نوعشو تشخیص بده و شی ای از کلاس کاربر وارد شده رو new کنه.به نظر شما اینجا حتما باید از factory class استفاده کنم؟لطفا یه کم توضیح بدین.