Menu
Coddy logo textTech

まとめ - 従業員の階層構造

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 26/91。

challenge icon

チャレンジ

簡単

この章で学んだすべての継承の概念を統合する、従業員階層システムを構築しましょう。すべての従業員が持つべき要素を定義する抽象基底クラスを作成し、それを拡張してボーナスの計算方法が異なる専門的な従業員タイプを作成します。

コードは4つのファイルに分けて構成します:

  • Employee.php — すべての従業員タイプの基礎となる抽象クラス Employee を定義します。このクラスは、protected プロパティ $name$salary を持つ必要があります。コンストラクタは両方の値を受け取り、それらを設定します。名前を返す getName() メソッド、給与を返す getSalary() メソッド、および子クラスが実装しなければならない抽象メソッド calculateBonus() を含めてください。また、"[name] earns $[salary] with bonus: $[bonus]" を返す getSummary() メソッドも追加してください。ここで [bonus]calculateBonus() を呼び出した結果です。
  • Manager.phpEmployee を継承する Manager クラスを定義します。ファイルの先頭で Employee ファイルをインクルードしてください。マネージャーはパーセンテージベースのボーナスを受け取ります。protected プロパティ $bonusPercentage を追加してください。コンストラクタは名前、給与、ボーナスパーセンテージを受け取る必要があります。最初の2つには parent::__construct() を使用し、その後にパーセンテージを自身で設定します。給与にボーナスパーセンテージを掛けて100で割った値を返すように calculateBonus() を実装してください。
  • Developer.phpEmployee を継承する Developer クラスを定義します。ファイルの先頭で Employee ファイルをインクルードしてください。デベロッパーは固定のプロジェクト完了ボーナスを受け取ります。protected プロパティ $projectBonus を追加してください。コンストラクタは名前、給与、プロジェクトボーナス額を受け取る必要があります。最初の2つには parent::__construct() を使用し、その後にプロジェクトボーナスを自身で設定します。固定のプロジェクトボーナス額をそのまま返すように calculateBonus() を実装してください。
  • main.php — Manager と Developer の両方のファイルをインクルードします。マネージャーの名前、マネージャーの給与、マネージャーのボーナスパーセンテージ、デベロッパーの名前、デベロッパーの給与、デベロッパーのプロジェクトボーナスの5つの入力を受け取ります。これらの値を使用して ManagerDeveloper を作成します。最初にマネージャー、次にデベロッパーの順で、それぞれの getSummary() を呼び出した結果を、それぞれ新しい行に出力してください。

このチャレンジは、抽象クラスがいかに契約を強制するかを示しています。すべての従業員はボーナスを計算できなければなりませんが、計算ロジックは役割によって異なります。Manager は給与のパーセンテージを使用し、Developer は固定額を受け取ります。親クラスの共有メソッド getSummary() は、ポリモーフィズムを通じてどちらのボーナス計算ともシームレスに機能します。

自分で試してみよう

<?php
require_once 'Manager.php';
require_once 'Developer.php';

// 入力を読み込む
$managerName = trim(fgets(STDIN));
$managerSalary = floatval(trim(fgets(STDIN)));
$managerBonusPercentage = floatval(trim(fgets(STDIN)));
$developerName = trim(fgets(STDIN));
$developerSalary = floatval(trim(fgets(STDIN)));
$developerProjectBonus = floatval(trim(fgets(STDIN)));

// TODO: マネージャーの入力を使用してManagerオブジェクトを作成する

// TODO: デベロッパーの入力を使用してDeveloperオブジェクトを作成する

// TODO: マネージャーのサマリーを表示する (getSummary())

// TODO: デベロッパーのサマリーを表示する (getSummary())
?>

オブジェクト指向プログラミングのすべてのレッスン