שאלה – מערכת לניהול רכבות

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

בעיקר (א) הבנת היררכיה + ציור (ב) בנאי העתקה (ג) עבודה עם מערך של אובייקטים (קרונות הרכבת).

חברת רכבות מנהלת רכבות המורכבות מקטר (Locomotive) ומקרונות (Wagon).

לכל קרון יש:

קיימים שני סוגים של קרונות:

קרונות נוסעים (PassengerWagon)

לכל קרון נוסעים יש בנוסף:

קיימים שני סוגים של קרונות נוסעים:

קרון דו־קומתי (DoubleDeckWagon)

קרון נוסעים בעל שתי קומות.

קרון מסעדה (RestaurantWagon)

קרון נוסעים הכולל מסעדה.

בנוסף לנתוני קרון נוסעים רגיל, יש לו:

הנחה: כל נוסע רוכש ארוחה אחת במהלך הנסיעה.

קרונות מטען (CargoWagon)

לכל קרון מטען יש בנוסף:

קיימים שני סוגים של קרונות מטען:

קרון מכלית (TankerWagon)

קרון להובלת נוזלים.

בנוסף:

קרון מכולות (ContainerWagon)

קרון להובלת מכולות.

בנוסף:

קטר (Locomotive)

לכל קטר יש:

רכבת (Train)

רכבת מכילה:


סעיף א

שרטטו את היררכיית הירושה המתוארת בשאלה.

סעיף ב

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

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);

שימו לב:

סעיף ג

במחלקה Wagon קיימת הפעולה:

public virtual double CalcRevenue()

המחזירה את ההכנסה שמפיק הקרון.

ממשו פעולה זו במחלקות הבאות:

לפי ההנחות הבאות:

סעיף ד

כתבו במחלקה 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.

ה־1

הסבירו מדוע הפעולה DuplicateCargoWagon מחייבת קיום של בנאי העתקה במחלקות הבאות:

בתשובתכם התייחסו לכך שקרון מטיפוס TankerWagon או ContainerWagon כולל גם את התכונות שירש מ־ CargoWagon ומ־ Wagon.

ה־2

ממשו את בנאי ההעתקה של המחלקה:

CargoWagon

ה־3

ממשו את בנאי ההעתקה של אחת משתי המחלקות: