PDA

View Full Version : سوال: استفاده از وراثت یا پلیمرفیزم



ghayegh
دوشنبه 29 مهر 1387, 17:37 عصر
با سلام
:لبخندساده:
سوالی که داشتم در رابطه با قضیه ی وراثت (Inheritance) و قضیه ی Polymorphism در C#.NET2005 است .

همانطور که می دانیم ، مثلا فرزند یک خانواده می تواند ویژگیهای رنگ چشم و رنگ پوست و غیره را از پدر و مادرش به ارث ببرد.

همین شخص می تواند ویژگیهای یک دانشجو را هم به ارث ببرد.

از آن طرف ، C#.NET2005 ، این اجازه را نداده که یک کلاس ، از بیش از یک کلاس ، چیزی را به ارث برد.

من خودم خیلی از مواقع برای اینکه نتوانستم به دلیل بالا ، از وراثت استفاده کنم ، از Polymorphism استفاده کرده ام.

مثلا برای حل مشکل بالا ، این کار را کرده ام :


class Daneshjoo
{
private string _Vazeyat_e_Tahsili = "اخراجی";
public string Vazeyat_e_Tahsili
{
get
{
return _Vazeyat_e_Tahsili;
}
set
{
_Vazeyat_e_Tahsili = value;
}
}


}



//کلاس ویژگی های ژنتیکی
class Genoa
{
private string _eyescolor = string.Empty;
public string eyescolor
{
get
{
return _eyescolor;
}
set
{
_eyescolor = value;
}
}


}



class Child
{
private Genoa objGenoa = new Genoa();
private Daneshjoo objDaneshjoo = new Daneshjoo();
public Genoa Genoa
{
get
{
return objGenoa;
}
set
{
objGenoa = value;
}
}
public Daneshjoo Daneshjoo
{
get
{
return objDaneshjoo;
}
set
{
objDaneshjoo = value;
}
}
}




نظر شما در رابطه با این کار من چیست ؟ آیا به نظرتان چنین کاری درست است؟
ممنون.

rostamkhani
دوشنبه 29 مهر 1387, 23:40 عصر
سلام
در ارث بری شما باید به این موضوع توجه کنید که می خواهید :
مفهومی را ایجاد کنید و این مفهوم جزئی تر است از مفهوم قبلی (مفهومی که ازش ارث بردین) ، دقیقتر است از مفهوم قبلی ، یا کامل تر است از مفهوم قبلی ولی همان مفهوم است ویا همان چیز هست نه چیز دیگری.

مثالهایی در net.
مثلا کلاس From شما میبینید که این کلاس خصوصیات زیادی دارد مثلا یک فرم میتواند دگمه ها زیادی را داشته باشد پس باید از کلاس Button ارث ببرد . نه این درست نیست .
مثلا کلاس SqlCommand : فرض کنید می خواهید این کلاس رو بنویسید میگیم چون SqlCommand میخواهد به دیتابیس وصل بشه پس باید از SqlConnection ارث ببرد .نه این درست نیست .

چرا ؟ برای اینکه استفاده کردن از یک کلاس با ارث بردن از آن بسیار متفاوت است .
اگر کلاسی بنوسیم بنام ClassCon که از SqlConnection ارث ببرد کلاس جدید ما میشود یک SqlConnection با امکانات بیشتری که این امکانات باید مربوط به کارهای اتصال به دیتابیسها باشد . نه امور دیگر . یا بهتر بگم باید بتونیم این جمله رو بگیم که ClassCon یک SqlConnection است. در حالی که میدانیم SqlCommand رو نمیتوان یک SqlConnection خواند و در SqlCommand از SqlConnection استفاده شده است .

ولی میتوان گفت که SqlCommand و OleDbCommand هر دو یک DbCommand هستند . چون هر دو از این کلاس ارث بردن .

یا در مثال اول: Form نمیتواند از Button ارث ببرد چون قرار نیست Button کاملتر و جدیدتری بسازیم

در مثالی که شما زدید
بچه نباید از کلاس دانشجو و نه از کلاس ژنتیک ارث ببرد . و در اصل همین شکلی که کلاس ها طراحی شدن درست است .

اگر بگوییم
1 . شخص می تواند ویژگیهای یک دانشجو را هم به ارث ببرد.(جمله شما)
یا بگوییم
2 . شخص می تواند ویژگیهای یک دانشجو را هم دارا باشد .
مفاهیم متفاوتی رو بیان کردیم

در حلات 1 شما سیستمی را تعریف میکنید که در این سیستم اشخاص یک دانشجو هستند.
یا شخص غیر دانشجویی وجود ندارد .( اگر سیستم را به این شکل در نظر گرفتین جمله درست است ولی
اگر در سیستمی که در نظر دارین اشخاص میتوانند دانشجو نباشند جمله اول درست نبوده و ارث بردن از دانشجو غلط است و بهتر است از composite یعنی مرکب کردن کلاس ها استفاده کنید .

در مورد ارث بردن از کلاس خصوصیات ژنتیکی با مفاهیم که ما از بچه و ژنتیک میدانیم سیستم عجیبی را باید در نظر گرفت که در آن سیستم بگوییم هر بچه یک سری خصوصیات ژنتیکی هست .

در آخر اگر بخواهیم برای مثال بگوییم
سیستمی داریم که هر A در این سیستم یک B هست با یک سری خصوصیات و توابع دیگر یعنی ارث بری چند گانه
براحتی مشکل رو با interface میتوانید حل کنید .

در کلاس بچه زیر بچه از کلاس Doneshjoo ارث برده و
از Interface [رنگ چشم و قد و کارهای بابا بزرگش]


class بچه : Daneshjoo , رنگ چشم و قد و کارهای بابا بزرگش
{
}

البته این برای سیستمی است که در این سیستم هر بچه حتما یک دانشجو هست و رنگ چشم و قد را حتما از بابا بزگشون به ارث میبرن:قهقهه: که این سیستم عجیبی هست و کلاس بچه باید به شکل دیگری باشد.
شاید بهتر باشه کلاس بچه از کلاس آدم ارث ببره

نظر شما دوستان چیه

afsharm
سه شنبه 30 مهر 1387, 09:35 صبح
من هم توضیحات کامل آقای/خانم رستم خانی را تایید می‌کنم. یعنی اینکه کلاس‌های طراحی شده ایراد خاصی نداشته و ضمنا اینترفیس‌ها هم به خوبی می‌توانند چنین کاربردهایی را پوشش دهند.

Itist82
سه شنبه 30 مهر 1387, 14:31 عصر
با تشکر اون دوستمون که جواب کامل و قشنگی دادن،یه چیز کوچولو اضافه می کنم:
در شی گرایی همون طور که می دونید 3 جور رابطه وجود داره که من با اصطلاحات متدلوژی OOA/OOD میگم روابط instance connection، is-aو whole-part. پیاده سازی هر کدوم از اینا یه جوره. وقتی مثل مثال شما داخل یه کلاس یه پروپرتی از جنس یه کلاس دیگه داریم در واقع کلاس اول "دارد یک" شی از جنس کلاس دوم. وقتی کلاس ها از هم ارث می برند، همون inheritance معروف خودمون وجود داره و وقتی نمونه های کلاس ها با هم رابطه های یک به چند یا یک به یک دارند، رابطه ی instance connection وجود داره.

KambizZandi
سه شنبه 30 مهر 1387, 14:54 عصر
در مسير تکميل زبانهاي برنامه نويسي ابتدا موضوع object محوري مطرح بود که به همين دليل polymorphism بوجود اومد
اما الان ديگه کلاسها از حالت holding براي data خارج شدن و محور روي فرآيند متمرکز شده
به خاطر همين هست که يک فرآيند جديد فقط ميتونه فرآيند قبلي رو تکميل کنه نه اينکه چند تا فرآيند رو با هم جمع کنه.
اگر بخواهيم اينکار رو انجام بديم بايد حتما از interface استفاده کنيم تا موضوع فرآيند محوري زير سوال نره.

ghayegh
چهارشنبه 01 آبان 1387, 13:25 عصر
با سلام و تشکر از همه ی کسانی که راهنمایی کردند :
:لبخندساده:
آقای KambizZandi (http://barnamenevis.org/forum/member.php?u=72243) گفته بودید :



در مسير تکميل زبانهاي برنامه نويسي ابتدا موضوع object محوري مطرح بود که به همين دليل polymorphism بوجود اومد
اما الان ديگه کلاسها از حالت holding براي data خارج شدن و محور روي فرآيند متمرکز شده
به خاطر همين هست که يک فرآيند جديد فقط ميتونه فرآيند قبلي رو تکميل کنه نه اينکه چند تا فرآيند رو با هم جمع کنه.
اگر بخواهيم اينکار رو انجام بديم بايد حتما از interface استفاده کنيم تا موضوع فرآيند محوري زير سوال نره.


موضوع جالبی را مطرح کردید . ولی اگه ممکنه ، همین قضیه ی Interface را در رابطه با مثال بالا بیشتر توضیح دهید. چون متوجه نمی شوم که Interface ، برای مثال بالا چه کاربردی می تواند داشته باشد. ممنون.:تشویق:

اَرژنگ
چهارشنبه 01 آبان 1387, 16:07 عصر
۱ـ " استفاده از وراثت یا پلیمرفیزم" بی معنی است. این دو موضوع از هم جداگانه هستند و مقایسه یکی با دیگری معنی نمیده.
۲-مبحث درست که دنبالش میگردید مقایسه "ارث بری با کمپوزیشن هست"، گوگل یاره هرکسی است که بگرده.
۳-اینکه چی از چی میتواند ارث ببرد و یا نه کاملا بستگی به نیازمندیهایه سیستم دارد، تجزیه تحلیل مطلقی نه در فلسفه و نه در برنامه نویسی درست نیست.

۴ـ این مثال از تمام استفاده‌هایه عملی به دور است، یک مثال دیگر به واقعیت بیشتر نزدیک باشد لازم است.

۵- استفاده از اینترفیسها در این مورد بازهم معنی نمیده، چونکه یک کاری میشه ، دلیل نیست که ازش استفاده بشه، استفاده از اینترفیس برایه این مثال روش حل بدتر از سوال اشتباه است.

rostamkhani
چهارشنبه 01 آبان 1387, 20:09 عصر
سلام
با 1 و 2 موافقم و منظور بنده همون composite بود و جمله مربوطه رو اصلاح کردم