שאלה: כיצד מתקשרת מחלקה אבסטרקטית לפולימורפיזם?

שאלה: כיצד מתקשרת מחלקה אבסטרקטית לפולימורפיזם?

ועוד לגבי מחלקה אבסטרקטית: ראיתי דוגמה למחלקה כזאת שמכילה שיטות ובכל זאת הופכים אותה לאבסטרקטית ע"י כך שהיא לא מכילה קונסטרקטור. למיטב הבנתי, השיטות במחלקה הנ"ל נועדו למחלקות שיורשות אותה. האם המחלקות היורשות יכולות להשתמש בכל השיטות של המחלקה האבסטרקטית ללא מגבלה?
 

BravoMan

Active member
היא משתמשת בשח-רחוק אלחוטי נייד.

או בשפת העמחה - פלאפון

&nbsp
וברצינות - אתה מתחיל לשאול שאלות יותר ויותר כלליות שאי אפשר לענות עליהן כמו שצריך בפורום, אלא צריך לפנות לחומר לימוד מסודר.
&nbsp
אני לא יודע באיזו שיטה אתה לומד, אבל אם אינך מבין מה היא מחלקה אובסטרקטית, הרי שאתה צריך לחזור על איזה פרק או שניים.
&nbsp
בקצרה - מחלקה אבסטרקטית נועדה להיות בסיס משותף למחלקות אחרות, אבל אין לה משמעות בשני עצמה.
אם בכל זאת יש מקומו בהם לא משנה איזו מהמחלקות היורשות מקבלים, אפשר להעביר להם אובייקטים דרך טיפוס של מחלקת אב וליצור קוד כללי יותר.
&nbsp
באשר לאפשרות גישה של מחלקה יורשת למתודות ואיברים של מחלקת אב, זה לא שונה עבור מחלקה אבסטרקטית מכל מחלקה אחרת:
זה תלוי עם איזו הרשאת גישה הוגדר פריט מסוים: public \ private \ protected.
 
אז הנה שאלה פחות כללית: האם יתכן שמחלקה אבסטרקטית

תכיל גם קונסטרקטור? אם כן, מתי? כנ"ל לגבי דסטרקטור וקופיקונסטרקטור.
 

BravoMan

Active member
כנראה משום שהיא מאפשרת, כמו כל מחלקת בסיס אחרת

טיפול משותף במספר סוגים שונים של מחלקות יורשות.
&nbsp
וזו הרי הגדרה בסיסית של פולימורפיזם לפי וויקיפדיאה...
&nbsp
לתשובה יותר מדויקת צריך לשאול את מי שערך את חומרי הלימוד שלך והכניס את הנושא תחת פרק מסוים...
 

BravoMan

Active member
כן, ייתכן.

מחלקה אבסטרקטית ב-++C היא כל מחלקה שיש לה לפחות מתודה אחת "ווירטואלית טהורה", כלומר מתודה שמוכרזת בצורה מיוחדת ללא מימוש.
&nbsp
כל עוד יש את החוסר הזה, המחלקה ווירטואלית ולא משנה כמה בנאים תגדיר לה.
(כנ"ל לגבי dtor וכו')
&nbsp
מתי נשתמש בזה?
בוא נניח שיש לך מחלקה אבסטרקטית של "חיית מחמד".
לכל חיית מחמד יש שם, אז הבנאי של המחלקה "חיית מחמד" חייב לקבל פרמטר "שם" ולשמור אותו.
&nbsp
זו פונקציונליות משותפת לכל המחלקות היורשות.
&nbsp
אבל, חיות שונות אוכלות אוכל שונה.
אז, תהיה פונקציה "לאכול" למחלקה הזו, שתהיה "ווירטואלית טהורה" כי אין לה מימוש משותף.
&nbsp
רק מחלקות יורשות, כמו "חתול", "דג", "אוגר" יממשו את הפונקציה הזו.
כמובן, היא כן קיימת במחלקת אב כדי לחייב מחלקות יורשות לממש אותה, אחרי הכל לא ייתכן שתיצור חיית מחמד שלא אוכלת...
(לא, pet rock לא נחשב לצורך הדוגמה שלנו
)
 
ועוד לגבי פולימורפיזם:

1) האם למעשה פולימורפיזם מבצע דריסה או העמסה של מטודה?
2) מתי צריך להשתמש ב-override והאם יש תחליף לתחביר כזה?
 

BravoMan

Active member
תשובות:

1) לא. פולימורפיזם מגדיר ממשק אחיד.
2) איזה תחביר, ולמה אתה רוצה תחליף?
 

bismark1

New member
אתה מתכוון למילה override?

הקוד ירוץ גם אם לא תשתמש בה (זו תוספת מאוחרת לשפה). משתמשים בה בשביל:
1. לגרום לקומפיילר לוודא שאכן המתודה שהוכרזה כ-override היא כזאת - במידה ואין מתודה וירטואלית כזאת במחלקת האב תקבל שגיאה בזמן קומפילציה וזה עוזר למנוע בעיות בזמן ריצה (אתה חושב שמתודה מסויימת נקראת כשלמעשה נקראת מתודה אחרת).
2. זה עוזר לקריאות של הקוד - ברור שמתודה כזו היא וירטואלית ומוגדרת גם במעלה עץ הירושה.
 

BravoMan

Active member
לא נורה - גם אני למדתי משהו!

לא ידעתי ש-++C הוסיפו סימון override בדומה ל-Java
 
למעלה