3447
צפיות
צפיות
3
תשובות
תשובות
האם מותר שכמה מחלקות יירשו ממחלקה אחת?
אני בונה תוכנה שיש בה מחלקה אחת של מאפיינים כלליים כלשהם (המחלקה הזו וירטואלית), ומעונינת ששלושת המחלקות האחרות יירשו ממנה.
האם זה אפשרי וכיצד?
אני בונה תוכנה שיש בה מחלקה אחת של מאפיינים כלליים כלשהם (המחלקה הזו וירטואלית), ומעונינת ששלושת המחלקות האחרות יירשו ממנה.
האם זה אפשרי וכיצד?
3 תשובות
אפשרי בהחלט.
לעומת זאת, בלא מעט שפות תכנות (Java, PHP…) אין הורשה מרובה – מחלקה אחת לא יכולה לרשת כמה מחלקות. ואם חושבים על זה בהיגיון, באמת אין צורך בכך. אם מגיעים למצב שבו יש בכך צורך – יש בעיה בתכנון של המערכת.
אפשר שכמה מחלקות יירשו מאותה מחלקה, לדוג': המחלקות פיצה ושניצל יורשות מהמחלקה אוכל. בהרבה שפות כמו JAVA אי אפשר שמחלקה אחת תירש מכמה מחלקות כדי למנוע דריסה – כל מחלקה יכולה לרשת רק מחלקה אחת. לדוג': המחלקה פיצה לא יכולה לירוש גם את אוכל וגם את גבינה לצורך העניין.
אני אמשיך את הדוגמה שרן שרייבר נתן כדי להבהיר את זה אף יותר.
כדי לדעת אם מחלקה צריכה לרשת מחלקה אחרת תשאל את עצמך שאלה אחת פשוטה – האם המחלקה היורשת (לעתיד) אמורה להיות מהטיפוס של המחלקה הנורשת? האם פיצה היא גבינה? לא, שכח מזה. האם פיצה היא אוכל? כן, לך על זה, אבל בחר במחלקה הקרובה ביותר. במילים אחרות, נניח שיש לך מחלקת מאפה (מופשטת כמובן), האם פיצה היא מאפה? כן. האם פיצה היא אוכל? כן. במקרה הזה (וברוב המקרים האחרים), תוכל לצמצם את זה באמצעות הבנה שגם מאפה הוא אוכל, אז הנה קשר הורשה (לא מרובה!): אוכל -> מאפה -> פיצה.
יכול להיות שתשאל: אבל אם יש מצב שבו מחלקה א' אמורה להיות גם מטיפוס מחלקה ב' וגם מטיפוס מחלקה ג', אני אצטרך הורשה מרובה.
ניקח לדוגמה אדם זאב – הוא גם אדם וגם זאב! במקרה כזה הרבה פעמים תגיע למסקנה שמחלקה א' לא אמורה להיות מטיפוס מחלקה ב' וגם לא מטיפוס מחלקה ג'. (יכול לקרות גם שאחת מהן כן תתאים.) היא יכולה להשתמש בהן או להיות מורכבת מהן, בדיוק כמו שפיצה יכולה להשתמש בגבינה, להיות מורכבת ממנה. במקרה כזה אתה תיישם את אדם הזאב בנפרד, אבל תזכור:
1. ייתכן מאוד שרוב המתודות והמאפיינים שלו אכן יהיו כמו של אדם או זאב. רוב הסיכויים הם שזה יהיה שילוב. כדאי יהיה לשקול לחלץ מתוך המחלקות את המכנים המשותפים לתוך מחלקה אחרת, שתשמש את את שתי המחלקות (או יותר), או להשתמש בממשקים משותפים.
במקרה של אדם זאב אולי תוכל להיעזר במחלקת אב מופשטת של בעל חי. (בכל במקרה של אדם וזאב תוכל להשתמש בזה.)
2. במקרים מסוימים מאוד ביישום המחלקה שלך (א') תוכל פשוט להשתמש במחלקות ב' וג'.
ברוב המקרים הורשה מרובה תגרום בסופו של דבר לבעיות Design ולבעיות לוגיות.