עבור לתוכן

בעיה בהורשה JAVA

Featured Replies

פורסם

אוקיי אז בניתי שלוש מחלקות כאשר כל אחת יורשת מהשניה כלי רכב-מכונית-מכונית ספורט

משום מה כשאני בא לפנות למחלקה העליונה ביותר מהמחלקה הנמוכה ביותר ע"י super.super.toString()

הוא נותן לי שגיאה...למישהו יש מושג?



public class sportcar extends car {


private double engineVolume;

public sportcar(double engineVolume,double maxVelocity,String model){
super(model, maxVelocity);
this.engineVolume=engineVolume;
}


public String toString() {
return super.super.toString();
}


public double getEngineVolume() {
return engineVolume;
}



}

פורסם

אני לא מכיר בע"פ סינטקס של ג'אווה - אבל מה שאתה עושה בטוח לא נכון.

המחלקה הזאת הרי לא יודעת (ולא צריכה לדעת!) כמה דרגות של 'הורים' יש לה. אתה לא יכול לפנות להורה של ההורה של ההורה וכו'.

לצורך העניין הדרך לממש את זה תהיה לעשות בתוך מכונית ספורט super.toString ולעשות אותו דבר בכלי רכב. ואז זה יחלחל למעלה.

מעבר לזה למה אתה דורס את ToString אם כל מה שאתה עושה בפנים זה לקרוא ל-ToString של ה-super?

פורסם

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

פורסם
  • מחבר

אוקיי זה התרגיל שקיבלתי...עשיתי הכל בידיוק לפי מה שרשום ואני לא מצליח להבין למה אתם מתכוונים :S

Form c:\Java2009-2010\Inheritance

תרגיל 1 בהורשה

1. יש ליצור את ההיררכיה הבאה:

[table] [tr] [td][/td] [/tr] [tr] [td][/td] [td]

clip_image001.gif[/td] [/tr] [/table]

במחלקה Vehicle:

  • שדה private String model
  • שדה private double maxVelocity
  • בנאי המקבל שני ארגומנטים: String ו-double עבור שני השדת
  • מתודה public String toString() המחזירה מחרוזת המורכבת משירשור הערך של model והערך של maxVelocity
  • מתודה public double getMaxVelocity המחזירה את הערך של השדה maxVelocity.

במחלקה Car היורשת מ-Vehicle:

  • שדה נוסף : private double velocity.
  • בנאי המקבל שני ארגומנטים: String, double עבור השדות model, maxVelocity .
  • מתודה public String toString() הדורסת את המתודה toString המגיעה בהורשה , ומחזירה מחרוזת בה הערכים המשורשרים של model, maxVelocity ו- velocity
  • מתודה נוספת public void drive(double v) המקנה לשדה velocity את הערך של הארגומנט v, בתנאי שהערך לא יהיה שלילי ולא יהיה גדול מ-maxVelocity.
  • מתודה נוספת public void wash() המדפיסה את המחרוזת “Washing…”.

במחלקה SportCar היורשת מ-Car:

  • שדה נוסף : private double engineVolume
  • בנאי המקבל שלושה ארגומנטים עבור model, maxVelocity ו- engineVolume.
  • מתודה public String toString המחזירה מחרוזת המכילה שירשור של ערכי model, maxVelocity ו- engineVolume.
  • מתודה public double getEngineVolume() המחזירה את הערך של engineVolume.

במחלקה Bus היורשת מ-Vehicle:

  • שני שדות נוספים: private double velocity,private int passengers.
  • בנאי המקבל שלושה ארגומנטים: String, double, int עבור השדות model, maxVelocity ו – passengers.
  • מתודה public String toString() הדורסת את המתודה toString המגיעה בהורשה , ומחזירה מחרוזת בה הערכים המשורשרים של , velocity, model, maxVelocity ו- passengers.
  • מתודה נוספת public void drive(double v) המקנה לשדה velocity את הערך של הארגומנט v, בתנאי שהערך לא יהיה שלילי ולא יהיה גדול מ-maxVelocity.

2. בנה מחלקה Garage בה :

· שלושה שדות private Car car, private SportCar sportCar, private Bus bus (הכלה).

· בנאי ללא ארגומנטים בו יוצרים אוביקט מסוג Car עבור התכונה car, אוביקט מסוג SportCar עבור התכונה sportCar, ואוביקט מסוג Bus עבור התכונה bus.

· מתודה public void doIt() בה קוראים למתודה drive על כל אחד משלושת השדות, ואחר מדפיסים עבור כל אחד מהם את הערך המוחזר ע"י toString שלו.

· מתודה main בה יוצרים אוביקט מסוג Garage, וקוראים עליו למתודה doIt().

תבדוק מהו הפלט.

פורסם

איפה רשום ש-SportCar צריכה להשתמש ב-toString של Vehicle? רק רשום שהיא צריכה לדרוס אותה.

אגב: שים לב לשמות של המחלקות שלך. קראת להן car ו-sportcar, כשבתרגיל נדרשת לקרוא להן Car ו-SportCar. ג'אווה היא שפה case sensitive, ויש הבדל בין שתי הצורות (ובכלל, בשמות של מחלקות נהוג להתחיל כל מילה באות גדולה).

ועוד אגב: מה שכתוב בויקיספר שגוי. אי אפשר לעשות בג'אווה super.super.

פורסם
  • מחבר

הtostring של car צריך להדפיס MaxV Velocity וMODEL

הtostring של sport car צריך להדפיס אותו דבר רק בלי Velocity ועם engineV ...בגלל זה אני לא יכול להשתמש בtostring של car...

רעיונות?

פורסם

אז צריך איכשהו לחשוף את model (נניח, להפוך אותו, או פונקציית גישה אליו, ל-protected). אין דרך אחרת.

אלא אם SportCar היה אמור להדפיס גם את velocity (זה נשמע לי הגיוני).

פורסם

מעניין.

כשיהיה לך פתרון שתף אותנו...

ע- למרות שמה שמבקשים ממך לעשות בעצם נוגד את כל המשמעות שבשבילה הורשה קיימת... אם SportCar הוא מסוג Vehicle ו-Car הרי בהכרח עליו להיות בעל הפרמטרים שלהם, ו-toString שלו צריך לשקף אותם. אחרת היית יוצר מחלקה רגילה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים