Jump to content
  • הצטרפו למשפחה

    היי, היי אתה (או את) שם!

    אנחנו יודעים, נחמד להיות אנונימי, ולמי בכלל יש כוח להירשם או להיות עכשיו "החדשים האלה".

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

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

JAVA למתקשים? "has a" relationship


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

פוסטים מומלצים

שלום מאגר ידע בלתי נדלה.

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

קבלתי רמז מהמתרגל שיחס של HAS A הוא המפתח.

בגדול יש לי CLASS אבסטרקטי ראשי, ממנו יורשות שתי מחלקות.

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

אני צריך שאחת מאותן חמש תהיה מסוגלת לקבל תכונות של כל שאר המחלקות, בצורה מתוזמנת.

יש לכם רעיון או דוגמאות או סתם תמיכה נפשית?

 

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

 

 

תודה :)

ומלא חג שמח.

מה חתימה? תתפשטי!

שיתוף קישור לתגובה
שיתוף באתרים אחרים

ארמגדון צודק ואני אסביר יותר לעומק.

 

נניח Interface (או מחלקה אבסטרקטית, כרצונך) מסוג Vehicle, ממנו יורשות שתי מחלקות אבסטרקטיות: PersonalVehicle ו-Truck.

(עץ הירושה של PersonalVehicle מפסיק לעניין אותנו כאן), מהמחלקה Truck יורשות המחלקות הבאות: GarbageTruck, MovingTruck, TowTruck, DeliveryTruck.

ולמחלקה TowTruck יש תכונה (שדה, Member, איך שאתם קוראים לזה) מסוג PersonalVehicle שמצביע על הרכב שהוא גורר כרגע (יכול להיות null משמע לא גורר כלום כרגע).

ליאור

מאזדה 3 2.0 "ספיריט" 2020

בתאריך 12.5.2021 בשעה 13:54, יבגניפ כתב:

באמת. אני אוהב אותך כמו שאתה.

יבגני כבר לא אוהב אותי 😭

שיתוף קישור לתגובה
שיתוף באתרים אחרים

כן אבל למה שתרצה לעשות דבר כזה?

כאילו מי שמחזיק את ה-TowTruck פשוט מחזיק אובייקט מסוג Truck ואז קובע אותו להיות נניח פעם TowTruck ופעם MovingTruck, זה נקבע לפי משפט ה-new שאתה שם.

נניח Truck myObject = new TowTruck הוא יהיה TowTruck, אח"כ myObject = new MovingTruck יהפוך להיות MovingTruck.

 

הדבר ההגיוני הוא דווקא אחר:

נניח שמ-PersonalVehicle יורשות המחלקות הבאות: Audi, BMW, MercedesBenz, Lexus וכו', ההגיון הוא שהשדה מסוג PersonalVehicle שנמצא בתוך המחלקה TowTruck יהיה פעם אחת אובייקט מסוג Lexus ופעם אחת BMW וכו', ואת זה אפשרי בהחלט לעשות וזה משהו שעושים.

 

זאת אחת הסיבות המרכזיות לשימוש בירושה.

 

 

הערה מאוד חשובה:

באובייקט myObject יהיה לך גישה אך ורק לשדות/שיטות שיש למחלקת Truck.

ליאור

מאזדה 3 2.0 "ספיריט" 2020

בתאריך 12.5.2021 בשעה 13:54, יבגניפ כתב:

באמת. אני אוהב אותך כמו שאתה.

יבגני כבר לא אוהב אותי 😭

שיתוף קישור לתגובה
שיתוף באתרים אחרים

תודה על הפירוט :)

מה הכוונה ב"מי שמחזיק את הTOWTRUCK"?

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

 

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

 

 

ומה זה Composition בכלל?

מה חתימה? תתפשטי!

שיתוף קישור לתגובה
שיתוף באתרים אחרים

Truck יכולה להיות מחלקה אבסטרקטית, אתה רק מחזיק משתנה מהסוג של Truck, אבל יצירת האובייקטים מתבצעת על סוגי המשנה (TowTruck וכו').

בשביל להסביר עמוק יותר אני אצטרך להיכנס איתך למצביעים, You up for it?

 

לא הבנתי בדיוק מה אתה צריך מהתרגיל, אתה יכול להעלות את התרגיל עצמו או את הטקסט שלו?

 

אגב מבחינת ירושה המילה "אחים" מתאימה (Siblings הוא מונח אנגלי נכון לזה, Sibling Classes זאת אומרת שהם שניהם יורשים מאותה מחלקה ונמצאים באותה רמת ירושה).

ו-Composition (או בעברית הרכבה) זה סוג של קשר המתאר מצב שאובייקט אחד מכיל אובייקט אחר (ניתן לתאר את הקשר גם בעזרת המילים Has A) כמו למשל רכב שמכיל אוסף של גלגלים.

 

קשר של Is A מתאר ירושה (למשל בדוגמה שלי PersonalVehicle is a Vehicle, כלומר יורש ממנו, ו-TowTruck has a PersonalVehicle, כלומר מחזיק כזה).

 

אגב אם שמת לב כל הדיון הזה תיאורטי ומנותק משפה (בכוונה), אין כאן שום קשר לג'אווה אלא ל-OOP (תכנות מונחה עצמים), ומהעולם הזה מגיעים כל המונחים שאתה מתאר.

אם תנסה לחפש את המונחים בג'אווה אני חושב שהכי קרוב שתקבל זה את instanceof של ג'אווה.

ליאור

מאזדה 3 2.0 "ספיריט" 2020

בתאריך 12.5.2021 בשעה 13:54, יבגניפ כתב:

באמת. אני אוהב אותך כמו שאתה.

יבגני כבר לא אוהב אותי 😭

שיתוף קישור לתגובה
שיתוף באתרים אחרים

Truck יכולה להיות מחלקה אבסטרקטית, אתה רק מחזיק משתנה מהסוג של Truck, אבל יצירת האובייקטים מתבצעת על סוגי המשנה (TowTruck וכו').

בשביל להסביר עמוק יותר אני אצטרך להיכנס איתך למצביעים, You up for it?

 

 

אם יש לך זמן? hit me.

 

 

לא הבנתי בדיוק מה אתה צריך מהתרגיל, אתה יכול להעלות את התרגיל עצמו או את הטקסט שלו?

 

התרגיל עצמו הוא PDF של חמישה עמודים, אני אוותר לך.

התרגיל הוא בניית משחק חלליות, עם חלוקה לשתי קטגוריות עיקריות - חלליות נשלטות משתמש וחלליות בשליטת המחשב. מהאחרונות יש חמישה סוגים, כל אחד בעל דפוסי התנהגות שונים. אחד הסוגים אמור להיות סוג מיוחד ואני אמור לבחור מה לעשות בו. הבחירה הייתה שישנה התנהגות כל 7 שניות, ויעבוד כל פעם כמו סוג אחר של חללית. אם אפשר, שיקבל גם את מתודת הפעולה של הHUMAN בסבב שלה.

 

מבחינת הדיזיין יש מחלקה אבסטרקטית של SpaceShips, ממנה יורשות שתי מחלקות. HumanShip ו- abstract EnemyShips, שאותה יורשות חמש מחלקות, לפי סוגי הספינות. ההבדל העיקרי בין הספינות הוא מתודת הפעולה שלהן, כשבין הHUMAN לבין הENEMY יש הבדל גם בייצוג הגרפי.

 

 

אגב מבחינת ירושה המילה "אחים" מתאימה (Siblings הוא מונח אנגלי נכון לזה, Sibling Classes זאת אומרת שהם שניהם יורשים מאותה מחלקה ונמצאים באותה רמת ירושה).

ו-Composition (או בעברית הרכבה) זה סוג של קשר המתאר מצב שאובייקט אחד מכיל אובייקט אחר (ניתן לתאר את הקשר גם בעזרת המילים Has A) כמו למשל רכב שמכיל אוסף של גלגלים.

 

קשר של Is A מתאר ירושה (למשל בדוגמה שלי PersonalVehicle is a Vehicle, כלומר יורש ממנו, ו-TowTruck has a PersonalVehicle, כלומר מחזיק כזה).

 

אגב אם שמת לב כל הדיון הזה תיאורטי ומנותק משפה (בכוונה), אין כאן שום קשר לג'אווה אלא ל-OOP (תכנות מונחה עצמים), ומהעולם הזה מגיעים כל המונחים שאתה מתאר.

אם תנסה לחפש את המונחים בג'אווה אני חושב שהכי קרוב שתקבל זה את instanceof של ג'אווה.

 

השאלה במקרה הזה היא באמת יותר תיאורתית מאשר יישומית - לשם שינוי הדילמות שלי הן עקרוניות ולא של איך לעזאזל אני כותב XYZ.

 

 

תגובות באדום,

תודות בכל צבע.

מה חתימה? תתפשטי!

שיתוף קישור לתגובה
שיתוף באתרים אחרים

אם יש לך זמן? hit me.

 

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

 

ברמת העיקרון עם כמה שיגידו לך שב-C#/Java אין מצביעים - יש מצביעים, הם פשוט מוסתרים ממך לנוחיותך, שאריות מזה עדיין ניתן לראות למשל במימוש של singleton שם תמצא if (m_instance == null) m_instance = new וכו'.

סוג המשתנה (החלק הראשון לפני השם של המשתנה) יכול להיות ממחלקה אבסטרקטית או אפילו מ-interface, כמובן שניתן ליצור מערכים ו-Containerים מסוג ה-interface המדובר, האתחול עצמו לא יכול להיות מסוג instance או מחלקה אבסטרקטית אלא חייב להיות מסוג מחלקה רגילה.

כלומר ניתן לעשות Vehicle v = new TowTruck וניתן לעשות גם Truck t = new TowTruck, בהנחה ש-Truck מחלקה אבסטרקטית לא תוכל לעשות Vehicle v = new Truck או Truck t = new Truck.

 

התרגיל עצמו הוא PDF של חמישה עמודים, אני אוותר לך.



התרגיל הוא בניית משחק חלליות, עם חלוקה לשתי קטגוריות עיקריות - חלליות נשלטות משתמש וחלליות בשליטת המחשב. מהאחרונות יש חמישה סוגים, כל אחד בעל דפוסי התנהגות שונים. אחד הסוגים אמור להיות סוג מיוחד ואני אמור לבחור מה לעשות בו. הבחירה הייתה שישנה התנהגות כל 7 שניות, ויעבוד כל פעם כמו סוג אחר של חללית. אם אפשר, שיקבל גם את מתודת הפעולה של הHUMAN בסבב שלה.

 

מבחינת הדיזיין יש מחלקה אבסטרקטית של SpaceShips, ממנה יורשות שתי מחלקות. HumanShip ו- abstract EnemyShips, שאותה יורשות חמש מחלקות, לפי סוגי הספינות. ההבדל העיקרי בין הספינות הוא מתודת הפעולה שלהן, כשבין הHUMAN לבין הENEMY יש הבדל גם בייצוג הגרפי.

 

אוקיי הבנתי יותר טוב, בעצם אתה רוצה שסוג אחד של החללית יהיה 7 שניות מסוג 1, 7 שניות מסוג 2, מסוג 3 ומסוג 4 ואז מסוג Human נכון? ואז תקבל בעצם 5 סוגים של Enemy?

לדעתי (ב-Design יש הרבה תשובות נכונות) הדרך הכי נכונה היא שה-JokerEnemyShip יחזיק למעשה מערך (או Container) של SpaceShip, ב-Ctor שלו הוא יאתחל את התאים במערך (0 יהיה הסוג הראשון, 1 יהיה הסוג השני וכו'), וישמור את הזמן יצירה שלו (אם אני זוכר נכון זה משהו כמו System.currentTimeMillis), בעת ההפעלה תבדוק מה הזמן הנוכחי שוב ע"י אותה פונקציה, תחסר ביניהם, את הערך הזה תחלק ל-1000 כדי לקבל את הזמן בשניות, ואז תחלק שוב ב-7 כדי לקבל זמן הפעלה של 7 שניות, ואז תפעיל מודולו (%) בין הערך שקיבלת מקודם ובין אורך המערך, הערך שתקבל זה המיקום במערך של החללית שאתה כרגע רוצה לחקות את ההתנהגות שלה.

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

ליאור

מאזדה 3 2.0 "ספיריט" 2020

בתאריך 12.5.2021 בשעה 13:54, יבגניפ כתב:

באמת. אני אוהב אותך כמו שאתה.

יבגני כבר לא אוהב אותי 😭

שיתוף קישור לתגובה
שיתוף באתרים אחרים

"has a" relationship

בתרגום חופשי זה ״יש״

 

למכונית יש מנוע


[left]Class Engine {
 public int horsePower;
}

Class Car {
 Engine engine = New Engine();
}


[/left]


 

מההסבר שלך לא ברור אם ההיררכיה שציינת היא בדיוק מה שכתוב בשאלה או שאתה הבנת את זה ככה (מחלקה א שממנה יורשות ב+ג ומ-ג׳ יורשות עוד 5 מחלקות, אם הבנתי נכון)

שיתוף קישור לתגובה
שיתוף באתרים אחרים

×
×
  • תוכן חדש...