בעיקר (א) הבנת היררכיה + ציור (ב) בנאי העתקה (ג) עבודה עם מערך של אובייקטים (קרונות הרכבת).
חברת רכבות מנהלת רכבות המורכבות מקטר
(Locomotive)
ומקרונות
(Wagon).
לכל קרון יש:
weight – משקל הקרון בטונות.קיימים שני סוגים של קרונות:
PassengerWagon)לכל קרון נוסעים יש בנוסף:
numPassengers – מספר הנוסעים בקרון.ticketPrice – מחיר כרטיס לנוסע.קיימים שני סוגים של קרונות נוסעים:
DoubleDeckWagon)קרון נוסעים בעל שתי קומות.
RestaurantWagon)קרון נוסעים הכולל מסעדה.
בנוסף לנתוני קרון נוסעים רגיל, יש לו:
mealPrice – מחיר ארוחה לנוסע.הנחה: כל נוסע רוכש ארוחה אחת במהלך הנסיעה.
CargoWagon)לכל קרון מטען יש בנוסף:
cargoWeight – משקל המטען בטונות.cargoValue – ערך המטען.קיימים שני סוגים של קרונות מטען:
TankerWagon)קרון להובלת נוזלים.
בנוסף:
pricePerTon – מחיר ההובלה לטון מטען.ContainerWagon)קרון להובלת מכולות.
בנוסף:
numContainers – מספר המכולות.pricePerContainer – מחיר ההובלה למכולה.Locomotive)לכל קטר יש:
id – מזהה הקטר.maxLoad – המשקל המרבי בטונות שהקטר מסוגל לגרור.Train)רכבת מכילה:
Locomotive loco.Wagon[] wagons.numWagons.שרטטו את היררכיית הירושה המתוארת בשאלה.
נתון קטע הקוד הבא. עליכם לכתוב את הבנאים והפעולות הדרושים במחלקות המתאימות, כך שקטע הקוד יעבוד בצורה תקינה.
string id = "L-101";
double maxLoad = 850;
int maxWagons = 20;
Train t1 = new Train(id, maxLoad, maxWagons);
double passengerWeight = 40;
int numPassengers = 80;
double ticketPrice = 25;
PassengerWagon pw =
new PassengerWagon(passengerWeight,
numPassengers,
ticketPrice);
t1.AddWagon(pw);
double restaurantWeight = 45;
int restaurantPassengers = 60;
double restaurantTicketPrice = 30;
double mealPrice = 55;
RestaurantWagon rw =
new RestaurantWagon(restaurantWeight,
restaurantPassengers,
restaurantTicketPrice,
mealPrice);
t1.AddWagon(rw);
double tankerWeight = 35;
double tankerCargoWeight = 70;
double tankerCargoValue = 500000;
double pricePerTon = 120;
TankerWagon tw =
new TankerWagon(tankerWeight,
tankerCargoWeight,
tankerCargoValue,
pricePerTon);
t1.AddWagon(tw);
double containerWeight = 38;
double containerCargoWeight = 60;
double containerCargoValue = 400000;
int numContainers = 12;
double pricePerContainer = 3000;
ContainerWagon cw =
new ContainerWagon(containerWeight,
containerCargoWeight,
containerCargoValue,
numContainers,
pricePerContainer);
t1.AddWagon(cw);
שימו לב:
Train מקבל את מזהה הקטר, את המשקל המרבי שהקטר מסוגל לגרור, ואת מספר הקרונות המרבי.
Train ליצור בעצמו אובייקט חדש מסוג
Locomotive.
Train ליצור מערך קרונות בגודל המתאים.
AddWagon במחלקה
Train.
במחלקה Wagon קיימת הפעולה:
public virtual double CalcRevenue()
המחזירה את ההכנסה שמפיק הקרון.
ממשו פעולה זו במחלקות הבאות:
PassengerWagonRestaurantWagonTankerWagonContainerWagonלפי ההנחות הבאות:
כתבו במחלקה Train את הפעולה:
public double TotalRevenue()
המחזירה את סך ההכנסות מכל הקרונות ברכבת.
אין להשתמש ב־cast.
לפניכם הפעולה הבאה מתוך המחלקה Train:
public bool DuplicateCargoWagon(int i)
{
if (i < 0 || i >= this.numWagons)
return false;
if (!(this.wagons[i] is CargoWagon))
return false;
if (this.numWagons == this.wagons.Length)
return false;
if (this.wagons[i] is TankerWagon)
this.wagons[this.numWagons] =
new TankerWagon((TankerWagon)this.wagons[i]);
else
this.wagons[this.numWagons] =
new ContainerWagon((ContainerWagon)this.wagons[i]);
this.numWagons++;
return true;
}
TankerWagon
או
ContainerWagon.
הסבירו מדוע הפעולה DuplicateCargoWagon מחייבת קיום של בנאי העתקה
במחלקות הבאות:
WagonCargoWagonTankerWagonContainerWagon
בתשובתכם התייחסו לכך שקרון מטיפוס
TankerWagon
או
ContainerWagon
כולל גם את התכונות שירש מ־
CargoWagon
ומ־
Wagon.
ממשו את בנאי ההעתקה של המחלקה:
CargoWagon
ממשו את בנאי ההעתקה של אחת משתי המחלקות:
TankerWagonContainerWagon