復習 - 従業員の階層構造
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 26/57。
チャレンジ
難しいスタッフ名簿を作成してください。Person は name を保持し、role() は person を返し、card() は role() から構成された Ada (person) を返します。Staff: Person は department を追加し、独自のイニシャライザで super.init の前に設定します。また、role() をオーバーライドして staff in <department> を返します。Manager: Staff は team(最初は空の Staff の配列)、メソッド hire(_:) を追加し、role() をオーバーライドして Staff の役割に続けて , 2 reports を返します。Contractor: Person は final で、days を追加し、role() をオーバーライドして contractor for 30 days を返します。
提供されたコードは、staff,name,dept、manager,name,dept、contractor,name,days の行と、hire,manager,staff(マネージャーが名前でスタッフメンバーを雇用する)を読み取ります。作成された順序で、すべての人物について card() を出力します。
コードは Person.swift、Staff.swift、Manager.swift、Contractor.swift に記述します。main.swift には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
var people: [Person] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "staff": people.append(Staff(name: p[1], department: p[2]))
case "manager": people.append(Manager(name: p[1], department: p[2]))
case "contractor": people.append(Contractor(name: p[1], days: Int(p[2])!))
default:
let boss = people.first { $0.name == p[1] } as? Manager
let member = people.first { $0.name == p[2] } as? Staff
if let boss = boss, let member = member { boss.hire(member) }
}
}
for person in people { print(person.card()) }
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド