Menu
Coddy logo textTech

復習 - 従業員の階層構造

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

challenge icon

チャレンジ

簡単

この章で学んだ継承の概念をすべて組み合わせた従業員階層システムを作りましょう。すべての従業員が持つべきものを Define する abstract な基底 class を作成し、それを拡張して、異なる方法でボーナスを計算する専門的な従業員タイプを作成します。

コードを4つのファイルに分けて整理します。

  • Employee.php: すべての従業員タイプの基盤となる abstract な Employee class を Define します。protected な properties $name$salary を持たせます。constructor は両方の値を accepts して設定します。名前を returns する getName() method、給与を returns する getSalary() method、そして子 class が Implement する必要がある abstract method calculateBonus() を含めます。また、"[name] earns $[salary] with bonus: $[bonus]" を returns する getSummary() method も追加します。ここで [bonus]calculateBonus() を呼び出した結果です。
  • Manager.php: Employee を extends する Manager class を Define します。先頭で Employee ファイルを Include します。Manager は percentage ベースのボーナスを受け取ります。protected な $bonusPercentage property を追加します。constructor は name、salary、bonus percentage を accepts する必要があります。最初の2つには parent::__construct() を使用し、その後 percentage を自分で設定します。salary に bonus percentage を掛けて100で割った値を returns するように calculateBonus() を Implement します。
  • Developer.php: Employee を extends する Developer class を Define します。先頭で Employee ファイルを Include します。Developer は fixed な project 完了ボーナスを受け取ります。protected な $projectBonus property を追加します。constructor は name、salary、project bonus amount を accepts する必要があります。最初の2つには parent::__construct() を使用し、その後 project bonus を自分で設定します。fixed な project bonus amount をそのまま returns するように calculateBonus() を Implement します。
  • main.php: Manager ファイルと Developer ファイルの両方を Include します。6つの inputs、つまり manager name、manager salary、manager bonus percentage、developer name、developer salary、developer project bonus を受け取ります。これらの値で ManagerDeveloper を Create します。まず manager に対して、次に developer に対して getSummary() を呼び出した結果を Print し、それぞれを別の行に出力します。

この challenge は、abstract classes がどのように contract を強制するかを示しています。すべての employee はボーナスを calculateBonus できなければなりませんが、その計算ロジックは role によって異なります。Manager は salary の percentage を使用し、Developer は fixed amount を受け取ります。parent class にある共有の getSummary() method は、polymorphism を通じてどちらのボーナス計算ともシームレスに連携します。

自分で試してみよう

<?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())
?>

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

自分で練習してみよう: PHPオンラインコンパイラ