PDA

View Full Version : نوشتن کد در برنامه و مشکل وراثت از دو کلاس



sajioo
یک شنبه 18 مهر 1389, 11:04 صبح
سلام دوستان
دو تا سوال داشتم اگه راهنماییم کنید ممنون می شم.
اول اینکه چطوری می شه یک کلاس تعریف کرد که از دو کلاس دیگه ارث بری داشته باشه. برای مثال من می خوام یک کلاس تعریف کنم که از TImage و TTimer ارث بری داشته باشه.
اصلا می شه؟ اگه می شه چطوری؟

دومین سوالم این که چطور می شه در یک برنامه کد نوشت؟
به طور واضح اگه بخوام بگم :
فرض کنید من یک کلاس نوشتم که در اون از کلاس TImage ارث بری داشتم.
حالا می خوام بگم اگه توی برنامه یک شی از این کلاس ساخته شد و بر روی آن کلیک شد ( یعنی رویداد onclick آن اجرا شد) برای مثال اندازه اون شکل دوبرابر بشه!
می تونم تو برنامه تعریف کنم که شی ایجاد بشه و عکس دلخواه من در اون نمایش داده بشه اما نمی تونم برای رویدادهای شی( مثل onclick - onmousemove ,.....) کدی بنویسم.
لطفا منو راهنمای کنید.
ممنون:لبخندساده:

vcldeveloper
یک شنبه 18 مهر 1389, 11:59 صبح
اول اینکه چطوری می شه یک کلاس تعریف کرد که از دو کلاس دیگه ارث بری داشته باشه. برای مثال من می خوام یک کلاس تعریف کنم که از TImage و TTimer ارث بری داشته باشه.
اصلا می شه؟
نه نمیشه. اگر به این نتیجه رسیدید که به وراثت چندگانه نیاز دارید، یعنی به احتمال 99% در طراحی کلاس ها تون مشکل دارید، و گرنه به همچین نتیجه گیری نمی رسیدید.

از طرف دیگه، TImage و TTimer هیچ سنخیتی با هم ندارند. کاری که شما میخواید انجام بدید، با ارث بری از یکی از اون ها و استفاده از یک شی از کلاس دیگه، امکان پذیر هست؛ مثلا ارث بری از TImage و ایجاد یک فیلد در کلاس جدید، از نوع TTimer.


اما نمی تونم برای رویدادهای شی( مثل onclick - onmousemove ,.....) کدی بنویسم.
درباره اختصاص دادن یک متد به یک رویداد در Runtime بارها تاپیک ایجاد شده و مثال زده شده.

esmit61
یک شنبه 18 مهر 1389, 20:15 عصر
اگر به این نتیجه رسیدید که به وراثت چندگانه نیاز دارید، یعنی به احتمال 99% در طراحی کلاس ها تون مشکل دارید، و گرنه به همچین نتیجه گیری نمی رسیدید.
جناب کشاورز.من این سوال برام پیش اومد اگه به احتمال زیاد طراحی اشکال داره ، چرا بعضی از زبانهای برنامه سازی وراثت چندگانه رو پشتیبانی میکنند. یعنی بخاطر اون 1% بوده. البته شنیدم که بقول بعضی ها این قابلیت در کامپایلرها یک پروژه شکست خورده هست. ولی دلیلی که من شنیده بودم این بود که پیچیدگی پیاده سازی رو به شدت زیاد میکنه.(پیاده سازی کامپایلر)
اگه ممکنه یه کم راجع به این مورد صحبت کنیم. ممنون

vcldeveloper
یک شنبه 18 مهر 1389, 21:46 عصر
جناب کشاورز.من این سوال برام پیش اومد اگه به احتمال زیاد طراحی اشکال داره ، چرا بعضی از زبانهای برنامه سازی وراثت چندگانه رو پشتیبانی میکنند. یعنی بخاطر اون 1% بوده. البته شنیدم که بقول بعضی ها این قابلیت در کامپایلرها یک پروژه شکست خورده هست. ولی دلیلی که من شنیده بودم این بود که پیچیدگی پیاده سازی رو به شدت زیاد میکنه.(پیاده سازی کامپایلر)
اگه ممکنه یه کم راجع به این مورد صحبت کنیم.
وراثت چندگانه فقط برای کامپایلر مشکل ایجاد نمیکنه، بلکه موجب پیچیدگی در طراحی نرم افزارهای تولید شده با اون زبان ها هم میشه. در واقع تمامی مسائلی که بر فرض براشون راه حل وراثت چندگانه پیشنهاد میشه رو می تونید بدون وراثت چندگانه هم حل کنید. برای همین هم در زبان هایی مثل جاوا یا #C یا دلفی خبری از وراثت چندگانه نیست. در واقع وراثت چندگانه ضررش بیشتر از منافعش هست.

A.Nemati
یک شنبه 18 مهر 1389, 22:59 عصر
در چنين مواردي استفاده از اينترفيس‌ها جايگزين بسيار خوبي براي وراثت چندگانه هستند. البته مزاياي اينترفيس بسيار زياد است كه يكي‌شان راه انداختن كار آن يك درصد است.

vcldeveloper
دوشنبه 19 مهر 1389, 12:05 عصر
در چنين مواردي استفاده از اينترفيس‌ها جايگزين بسيار خوبي براي وراثت چندگانه هستند.

استفاده از Interface با وراثت فرق میکنه؛ شما یک Interface را Implement می کنید، ازش ارث بری نمی کنید. وقتی شما یک کلاس پایه دارید که ازش ارث می برید، رابط و پیاده سازی بخشی از رفتارها و خصوصیات کلاس های فرزند را که بین همه آنها مشترک هست را به اون کلاس پایه منتقل می کنید، اما یک اینترفیس اصلا پیاده سازی نداره، بلکه فقط یک تعریف عمومی هست. یک اینترفیس مثل یک قرارداد و توافقنامه هست، یک کلاسی که یک اینترفیس را پیاده سازی میکنه، در واقع اعلام میکنه که به مواد آن اینترفیس (توافقنامه) پایبند هست. اینها مفاهیم مختلفی هستند.