概要
課題集8と9では,継承と多態性の応用に焦点が当てられました.主要な内容は以下の通りです:
- 航空貨物管理システムのクラス階層設計
- ワイパー制御機構の拡張機能実装
- 点・線・平面オブジェクトの継承構造再構築
航空貨物管理システムの設計
入力仕様
顧客ID 顧客名 電話番号 住所 貨物数 [貨物ID 貨物名 幅 長さ 高さ 重量] * n 便名 出発空港 到着空港 日付(YYYY-MM-DD) 最大積載量 注文ID 注文日(YYYY-MM-DD) 発送元住所 発送元名 発送元電話 宛先住所 宛先名 宛先電話
クラス設計
UMLクラス図を示します:
| Customer | |----------------| | - id: String | | - name: String | | - phone: String| |----------------| | + getName() | | + getPhone() | | Cargo | |----------------| | - cargoId | | - dimensions | | - weight | |----------------| | + calcFee() | | Order | |----------------| | - items: List | | - flightInfo | |----------------| | + validateLoad()| | + printInvoice()|
Java実装例
public abstract class ShippingCustomer {
protected String customerId;
protected String customerName;
public abstract double getDiscountRate();
}
public class BusinessCustomer extends ShippingCustomer {
private static final double DISCOUNT = 0.8;
@Override
public double getDiscountRate() {
return DISCOUNT;
}
}
public abstract class ShipmentItem {
protected double width;
protected double length;
protected double height;
public double getVolumetricWeight() {
return (width * length * height) / 6000;
}
public abstract double getRateMultiplier();
}
点・線・平面の継承モデル
Element抽象クラスによる再設計:
public abstract class GraphicElement {
public abstract void render();
}
public class PointElement extends GraphicElement {
private double xPos;
private double yPos;
@Override
public void render() {
System.out.printf("位置: (%.2f, %.2f)%n", xPos, yPos);
}
}
public class PlaneElement extends GraphicElement {
private String colorCode;
@Override
public void render() {
System.out.println("平面の色: " + colorCode);
}
}
実行例
入力: 100.0 150.0 50.0 180.0 Blue 出力: 先端点: (100.00,150.00) 終端点: (50.00,180.00) 平面の色: Blue
貨物管理の拡張設計
多態性を用いた貨物区分の実装:
public class HazardousCargo extends ShipmentItem {
@Override
public double getRateMultiplier() {
double volWeight = getVolumetricWeight();
if (volWeight > 100) return 20;
if (volWeight > 50) return 30;
return 50;
}
}
public class ExpressCargo extends ShipmentItem {
@Override
public double getRateMultiplier() {
double volWeight = getVolumetricWeight();
if (volWeight > 100) return 30;
if (volWeight > 50) return 40;
return 50;
}
}