課題集8と9における継承と多態性の適用事例

概要

課題集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;
  }
}

タグ: Java オブジェクト指向設計 継承 ポリモーフィズム システム設計

8月24日 18:26 投稿