まとめ - 従業員の階層構造
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 24/70。
チャレンジ
簡単この章のすべての継承の概念を統合した、従業員階層システムを構築しましょう。異なる従業員タイプが共通の属性を共有しながら、ボーナスの計算方法が異なる会社構造を作成します。
コードは4つのファイルに分けて構成します:
Employee.cs:Company名前空間内にベースとなるEmployeeクラスを定義します。すべての従業員はName(string) とSalary(decimal) を持ちます。両方の値を受け取るコンストラクタを作成してください。デフォルトで給与の10%を返すvirtualメソッドCalculateBonus()を追加します。ToString()をオーバーライドして、"{Name} - ${Salary}"を返すようにします。Manager.cs:Employeeを継承するManagerクラスをCompany名前空間内に定義します。マネージャーには追加のTeamSizeプロパティ (int) があります。コンストラクタは名前、給与、チームサイズを受け取り、baseを使用して親クラスを初期化する必要があります。CalculateBonus()をオーバーライドして、給与の15%にチームメンバー1人につき$50を加えた額を返すようにします。ToString()をオーバーライドして、"{Name} - ${Salary} (Manager, Team: {TeamSize})"を返すようにします。Developer.cs:Employeeを継承するDeveloperクラスをCompany名前空間内に定義します。デベロッパーにはProgrammingLanguageプロパティ (string) があります。コンストラクタは名前、給与、プログラミング言語を受け取ります。CalculateBonus()をオーバーライドして、給与の12%を返すようにします。ToString()をオーバーライドして、"{Name} - ${Salary} (Developer, {ProgrammingLanguage})"を返すようにします。Program.cs: メインファイルで、入力値を使用して各従業員タイプを1つずつ作成します。ポリモーフィズムを実証するために、3つすべてをEmployee参照の配列に格納します。配列をループで回し、各従業員のToString()の結果と、それに続いてボーナスを出力します。
以下の8つの入力を受け取ります:
- ベース従業員の名前
- ベース従業員の給与
- マネージャーの名前
- マネージャーの給与
- マネージャーのチームサイズ
- デベロッパーの名前
- デベロッパーの給与
- デベロッパーのプログラミング言語
各従業員の情報とボーナスを以下の形式で出力してください:
{ToString result}
Bonus: ${CalculateBonus result}例えば、入力が John, 50000, Sarah, 80000, 5, Mike, 70000, C# の場合、出力は以下のようになります:
John - $50000
Bonus: $5000
Sarah - $80000 (Manager, Team: 5)
Bonus: $12250
Mike - $70000 (Developer, C#)
Bonus: $8400各従業員タイプが異なる方法でボーナスを計算しているにもかかわらず、単一の Employee 配列を通じてそれらすべてを処理できることに注目してください。これが継承とポリモーフィズムを組み合わせる力です!
自分で試してみよう
using System;
using Company;
class Program
{
public static void Main(string[] args)
{
// 基本の従業員の入力を読み込む
string empName = Console.ReadLine();
decimal empSalary = Convert.ToDecimal(Console.ReadLine());
// マネージャーの入力を読み込む
string mgrName = Console.ReadLine();
decimal mgrSalary = Convert.ToDecimal(Console.ReadLine());
int teamSize = Convert.ToInt32(Console.ReadLine());
// 開発者の入力を読み込む
string devName = Console.ReadLine();
decimal devSalary = Convert.ToDecimal(Console.ReadLine());
string progLang = Console.ReadLine();
// TODO: Employee、Manager、Developer をそれぞれ1つずつ作成する
// TODO: ポリモーフィズムを示すために、これら3つすべてを Employee 配列に格納する
// TODO: 配列をループで回し、各従業員の ToString() とボーナスを出力する
// 形式:
// {ToString の結果}
// Bonus: ${CalculateBonus の結果}
}
}