まとめ - 従業員の階層構造
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 26/91。
チャレンジ
簡単この章で学んだすべての継承の概念を統合する、従業員階層システムを構築しましょう。すべての従業員が持つべき要素を定義する抽象基底クラスを作成し、それを拡張してボーナスの計算方法が異なる専門的な従業員タイプを作成します。
コードは4つのファイルに分けて構成します:
Employee.php— すべての従業員タイプの基礎となる抽象クラスEmployeeを定義します。このクラスは、protected プロパティ$nameと$salaryを持つ必要があります。コンストラクタは両方の値を受け取り、それらを設定します。名前を返すgetName()メソッド、給与を返すgetSalary()メソッド、および子クラスが実装しなければならない抽象メソッドcalculateBonus()を含めてください。また、"[name] earns $[salary] with bonus: $[bonus]"を返すgetSummary()メソッドも追加してください。ここで[bonus]はcalculateBonus()を呼び出した結果です。Manager.php—Employeeを継承するManagerクラスを定義します。ファイルの先頭で Employee ファイルをインクルードしてください。マネージャーはパーセンテージベースのボーナスを受け取ります。protected プロパティ$bonusPercentageを追加してください。コンストラクタは名前、給与、ボーナスパーセンテージを受け取る必要があります。最初の2つにはparent::__construct()を使用し、その後にパーセンテージを自身で設定します。給与にボーナスパーセンテージを掛けて100で割った値を返すようにcalculateBonus()を実装してください。Developer.php—Employeeを継承するDeveloperクラスを定義します。ファイルの先頭で Employee ファイルをインクルードしてください。デベロッパーは固定のプロジェクト完了ボーナスを受け取ります。protected プロパティ$projectBonusを追加してください。コンストラクタは名前、給与、プロジェクトボーナス額を受け取る必要があります。最初の2つにはparent::__construct()を使用し、その後にプロジェクトボーナスを自身で設定します。固定のプロジェクトボーナス額をそのまま返すようにcalculateBonus()を実装してください。main.php— Manager と Developer の両方のファイルをインクルードします。マネージャーの名前、マネージャーの給与、マネージャーのボーナスパーセンテージ、デベロッパーの名前、デベロッパーの給与、デベロッパーのプロジェクトボーナスの5つの入力を受け取ります。これらの値を使用してManagerとDeveloperを作成します。最初にマネージャー、次にデベロッパーの順で、それぞれの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())
?>