Mixin - אבסטרקט?

שאלה לגבי הדוגמא. האם Clickable ו- LargeRectangle הן אבסטרקטיות או שלא בהכרח וזה תלוי קוד?
בהסבר כתוב:

Mixin היא מחלקה שאין לה תכלית בפני עצמה, והיא קיימת כדי “לתרום” תכונות ופעולות למחלקה שתירש אותה.

לפי ההסבר זה נשמע שלא משתמשים במחלקות האלה כדי ליצור מופעים שלהן, אבל בקוד לא היה שימוש במודל של אבסטרקט.

2 לייקים

כן, הן נחשבות אבסטרקטיות לפי ההגדרה היבשה של מחלקה אבסטרקטית במדעי־המחשב (מחלקה שלא יוצרים ממנה מופעים), אבל אין סיבה להשתמש ב־ABC כאן כי אנחנו לא רוצים להכריח אף אחת מתתי־המחלקות לממש פעולות מסוימות.


הרחבה:

  1. בתורת הטיפוסים אנחנו מגדירים טיפוס אבסטרקטי (abstract type, סוג משתנה אבסטרקטי) כטיפוס שאי אפשר ליצור ממנו מופעים. טיפוס שכן אפשר ליצור ממנו מופעים (הקבוצה המשלימה לטיפוס אבסטרקטי) נקראת טיפוס מוחשי (concrete type).
  2. בשפות תכנות רבות נהוג שבטיפוס האבסטרקטי כתובות חתימות של פעולות (שם ופרמטרים) ללא מימוש, שתתי־המחלקות שיורשות ממנה חייבות לממש. מחלקות אבסטרקטיות שיש בהן רק חתימות של פעולות בלי אף מימוש נקראות “מחלקות אבסטרקטיות טהורות” (ובשמות הלא תיאורטיים בשפות שונות קוראים לזה interface, protocol או class type).

כמו שאולי שמת לב ונרמז במחברת, בפועל, אפשר ליצור מופעים מתוך “מחלקות אבסטרקטיות” בפייתון כל עוד לא הגדרנו את __init__ כ־abstractmethod. משמע שבפייתון מחלקה אבסטרקטית לא באמת עונה על ההגדרה המדמ"חניקית גרידא של מחלקה אבסטרקטית.
המטרה של ABC בפייתון, בכל מקרה, היא לתת לך אפשרות להשתמש במה שכתבתי בסעיף 2 – להגדיר באופן כללי קווים מנחים למחלקות שהולכות לרשת מהמחלקה שלך – פעולות שהם יהיו חייבים לממש. זה מאוד מועיל כשאתה רוצה לתת למתכנתים אחרים רעיון כללי לגבי מה צריך לממש כדי שמחלקה שהם יוצרים עבור התוכנה שלך תעבוד (נניח, לצורך מערכת פלאגינים או משהו בסגנון)

4 לייקים

אז אם הבנתי נכון, המחלקות של Mixin הן חיה דומה ל implements של ג’אווה, רק שהן לא פונקציות ריקות שמחייבות מימוש, אלא מחלקות רגילות?

זה קצת עקום עבורי להסתכל על זה מהעיניים של Java, אבל אם הייתי חייב אז כן, אפשר לממש Mixin כ־public interface עם default methods

לייק 1

לפחות אתה יודע גאווה :slight_smile: #חציהכוסהמלאה