מה יותר מונחה עצמים ? java oop

  • פותח הנושא kawa
  • פורסם בתאריך

kawa

New member
מה יותר מונחה עצמים ? java oop

שלום אני מתכנתת בג´אווה ב jdk1.3 ומקמפלת בעזרת editplus . אני עובדת עכשיו על פרוייקט במסגרת הלימודים - של תכנות משחקים. המטרה - (המשחקים הם משחקי לוח) מחלקה ששמה Board שהיא המחלקה שממנה יירשו כל משחקי הלוח - בול פגיעה, משחק הזכרון, רברסי, חמש בשורה ( מכיוון שזה מונחה עצמים ניתן יהיה לתכנת גם משחק 6 7 ו 8 בשורה- הקונסטרקטור של חמש בשורה יקבל את המספר כל עוד הוא יהיה בגבולות הסביר למשל לא 100 בשורה ). יש לי שתי אפשרויות תכנות- האחת - המחלקה Board תהיה אבסטרקטית- מה שהכי הגיוני שכן אין ´משחק לוח´ אלא יש ´משחק שחמט שהוא משחק לוח´ או ´משחק בולפגיעה שהוא משחק לוח´- למחלקה הזאת תהיה תכונה ששמה מסגרת. האפשרות השניה - מחלקה Board תהיה יורשת את Frame . לפי מיטב הבנתי מחלקה אבסטרקטית לא יכולה לרשת מחלקה אבסרקטית כלומר אם אני רוצה ש Board תירש את Frame אסור ל Board להיות אבסטרקטית . למרות שלא בדקתי- אני מניחה שיש יתרונות רבים לירושת Frame - ויתרונות רבים ליצירת Board כאבסטרקטית- פשוט מכיוון ש בגישה מונחית עצמים זה יהיה לא נכון להפוך את מחלקת מכונית או חיה לממשיות כאשר אין ´חיה´ אלא יש כלב או חתול ואין ´מכונית´ אלא יש יגואר או מרצדס. איזה גישה עדיפה לדעתכם ואיזו גישה נכונה יותר לדעתכם, והם לירושת Frame ישנן יתרונות שלא ניתן להשיג כאשר Frame תהווה תכונה בלבד? תודה רבה מראש... kawa
 

yair24

Member
אני רואה שאת ממש אוהבת

דברים מונחים עצמים... יש בדיחה שסיפרו לי... (אל תדאגו היא לא מצחיקה זה בדיחה של מתכנתים) כמה מתכנתי C צריכים כדי להחליף מנורה וכמה מתכנתי C++ צריכים כדי להחליף מנורה? מתכנתי C צריכים 2 אחד שיכתוב את הפונקציה שמחליפה את המנורה והשני כדי לקרוא לפונקציה... מתכנתי C++ לא צריכים בכלל. כי המנורה מחליפה את עצמה... גיחי גיחי תגידי מה זה מחלקת FRAME? יאיר
 

אלדד26

New member
../images/Emo32.gif וכמה פסיכולוגים צריך?

רק אחד - אבל זה ייקח הרבה זמן, והמנורה צריכה לרצות להשתנות...
 
הגירסה שלי ../images/Emo13.gif

כמה מתכנתים צריך כדי להחליף נורה?? אף אחד! זו בכלל בעיית חומרה לא תוכנה...
 

biker_jo

New member
תשובה

אני הייתי יוצר את board כאבסטרקטית ויורש ממנה. מה יותר פשוט מלהעמיס פונקציות על board כמו getFreeSquares או getNeightbours דרך מחלקות בת ? יותר מזה, את יכולה ליצור עוד מחלקה אבסטרקטית actor והילדים שלו יישמו, כל משחק בצורה שונה, את getMoves או checkWin וכו´ וכו´ מעל זה תייצרי מחלקה שיודעת שאם יש משחק X, אז היא מייצרת לוח ל X ושני שחקנים X כשאחד הוא כזה והשני אחר. מאוד מקווה שעזרתי.
 

kawa

New member
עזרת מאד ../images/Emo23.gif

אז ככה... בסוף החלטתי לעשות אותה אבסטקרטית כאשר Frame תהיה התכונה שלה בקשר למתודות - אז ככה - את המתודות של לבדוק מי המנצח אני הולכת לשים לא במחלקה עצמה אלא במחלקה המטפלת- אני הולכת לבנות ממשק של מתודות שהן כולן תגובה למשחק- כלומר לבדוק מי המנצח וכו- אשר יירש מ ActionListener . למחלקת בורד יהיו כמה יורשים - כל אחד מייצג סוג אחר של משחק לוח BoardGame=new XinaRrow() האמת היא שיש לי קונספט שלם ל´מערכת הירושה´ מה שנקרא ה Design - אני הולכת לבצע אותו ואם זה יצליח אני אעלה לכאן קוד- אך מה שנראה לי יותר קרי- אולי אני אעלה לכאן קובץ וורד עם התרשים זרימה של איזה מחלקה יורשת ממי... כדי להדגים את ה Design שעשיתי
kawa
 

voguemaster

New member
ויישום ה-FRAME ?

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

kawa

New member
frame

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

חובבן

New member
לפי מה שידוע לי

אין שום בעיה שמחלקה אבסטרקטית תירש מחלקה אבסטרקטית, זה אפילו הכרחי. לדוגמא מונית יורשת ממכונית יורשת מכלי רכב. שתי האחרנות אבסטרקטיות. מה שמאד לא מומלץ זה ליצור instance של super class. למרות שזה אפשרי בשפות רבות, זה בדרך כלל נחשב לdesign גרוע.
 

kawa

New member
אי אפשר ליצור אינסטנס של אבסטרקט

או שאני טועה? לפי מיטב זכרוני אי אפשר לשאול האם האובייקט הבא הוא מסוג חיה ( אם חיה אבסטרקטית )....
 

kawa

New member
שאלה לגבי דריסת מתודות בjava ../images/Emo36.gif

אוקי. נאמר שיש לי אב ( במקרה שלי- לאב האבסטרקטי קוראים לוח ) ולאב הזה יש בן יורש שקוראים לו ´לוח של משחק X בשורה´ ( שזה משחק אשר בהתאמה אישית יכול להיות 4 בשורה 5 בשורה או עשר בשורה לפי בחירת המתכנת/ת שישתמש במחלקה).עכשיו- לאב- בקונסטרקטור עצמו- יש קריאה למתודה בשם ´בנה לוח´ המתודה הזאת ביסודה שמה את המשבצות על הלוח. לבן - יש מתודה בנה לוח אשר דורסת את מתודת האב. עכשיו- הקונסטרקטור של האב הרי מכיל כבר קריאה למתודה הזאת- ( של בנה לוח) לכן אין צורך לקרוא לה שוב מן הקונסטרקטור של הבן. השאלה היא
כאשר קוראים לקונסטרקטור של הבן - איזה מתודה מופעלת - זאת של האב או זאת של הבן ? אז נכון שהמתודה ´בנה לוח´ של האב נקראת מן הקונסטרקטור אבל היא כבד דרוסה על ידי מתודה של הבן השאלה מה יפעל? תודה kawa
 

voguemaster

New member
כלומר

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

kawa

New member
מצאתי!

אז ככה
super.theMethod(); System.out.println("fkadjgkajdfklaslahkdf");​
יש קונסטרקטור. הבן יורש את הקונסטרקטור. קונסטרקטור האב קורא למתודה. אבל יש ´דריסת´ מתודה אצל הבן. הקונסטרקטור של הבן יקרא למתודה הדרוסה של הבן * שכמובן, אם רוצים להוסיף למתודה של הבן דברים לא במקום האב אלא ב´נוסף´ לו יש לכתוב את הקוד למעלה. וזאת סתם על סמך ניסוי, טעייה, ופתיחת פרק 5 בספר ג´אווה על כוס קפה
kawa
 

kawa

New member
מתודה הגורמת לכפתור להיות לא זמין

בדקתי ב api באותו מקום בדיוק שבו אמורים לתת את המתודה של הכפתור- ועדיין לא הבנתי מהי המתודה שהופכת כפתור ל´לא לחיץ´
kawa
 

voguemaster

New member
הממ...

תקני אותי אם אני טועה, אבל יש מתודה שכפתורים יורשים מ-Component הנקראת setEnabled. היא מקבלת ערך בוליאני. לזה התכוונת ? בכלל, Component מגדירה חתיכת כמות של שיטות שזה לא ייאמן. כנ"ל ב-SWING אלי
 
למעלה