עוד שאלת OOP

עוד שאלת OOP

נניח שיש לי ישות כמו "מכונית". לישות יש מתודה "התנע". עד כאן הכל טוב ויפה: אפשר ליצור Interface עם המתודה הנ"ל, או ליצור מחלקה אבסטרקטית, או סתם ירושה (לא מת על זה) ממחלקה "אמיתית". הבעיה היא: אני יודע שלכל מכונית צריך להיות מאפיין/משתנה פנימי מסוג "מנוע". האם אני יכול לחייב את המחלקות שמממשות את ה interface הזה שיהיה להם "מנוע" - גם אם הוא לא חשוף כלפי חוץ?
 

ייוניי

New member
אתה לא יכול וגם לא ממש כדאי לך

אתה צריך לשאול את עצמך למה אתה יודע שלכל מכונית צריך להיות מנוע וכיצד הידיעה הזו משפיעה על הקוד שלך? אם המנוע לא חשוף כלפי חוץ למה לך לחייב את המחלקות להכיל מנוע?
 
כי המימוש הוא פנימי

אני יודע שצריך להיות מימוש למאפיין מסויים, אבל כל מחלקה צריכה לממש את זה בצורה אחרת. נניח שאני אפליקציה לתקשורת. יש לי interface שיש לו מתודה send. אבל כל class שמממש את ה interface הזה שולח פאקטות דרך פורט מסוים, הפורט "שלו". אז הפורט כאן הוא מאפיין פנימי, שאין לו שום נגיעה חיצונית. אבל אני רוצה שהמתכנת שיעבוד על זה ישים את הפורט hard coded במקום ש"נכפה" עליו. זה הרעיון.
 

ייוניי

New member
->

עדיין לא ענית לי איך אתה "יודע" שצריך להיות מאפיין מסויים אם אתה לא עושה בו שימוש בשום מקום? במה עוזרת לך הידיעה הזו? אם אין לזה שום השפעה על שאר המערכת תן לכל מחלקה לעשות מה שהיא רוצה. בכל זאת אתן לך רעיון לגבי הדוגמא שהצגת:
public interface Sender { void send(string thisMessage, SocketFactory usingASocketFromThisFactory); } public interface SocketFactory { Socket openSocket(int port); } public interface Socket { void send(string thisMessage); }​
עכשיו סביר להניח שכל מחלקה שתממש את Sender תחזיק משתנה מקומי (או קבוע) של הפורט שבו היא תשתמש. אני עדיין לא "מכריח" אף אחד לעשות שום דבר אבל בוא נגיד שזה בגדר "המלצה חמה". אם אתה רוצה להיות באמת אלים אתה יכול להוסיף לממשק Sender מתודה getPort אבל זה כבר ממש מזיק לקוד...
 

arnonrgo

New member
משהו כזה

אתה יכול לעזות משהו כמו בדיאגרמה כאשר EngineCar הוא אבסטרקטי
 
למעלה