Menu
Coddy logo textTech

Итоги — Иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 40 из 107.

challenge icon

Задание

Легко

Давайте создадим систему иерархии сотрудников для компании, которая демонстрирует, как композиция элегантно моделирует реальные организационные структуры. Вы создадите базовый тип сотрудника, который специализированные роли смогут расширять своим собственным уникальным поведением.

Вы организуете свой код в трех файлах:

  • employee.go: Создайте основу со структурой Employee, содержащей поля ID, Name и BaseSalary (float64). Добавьте ей два метода:
    • Info() string, который возвращает [ID] [Name]
    • CalculateBonus() float64, который возвращает 10% от базовой зарплаты
  • roles.go: Создайте два специализированных типа сотрудников, которые встраивают Employee:
    • Manager с полем TeamSize (int) — менеджеры получают более высокий бонус: 20% от базовой зарплаты плюс $100 за каждого члена команды. Перекройте (shadow) метод CalculateBonus для реализации этой логики.
    • Developer с полем Language (string) — разработчики сохраняют стандартный бонус, но перекрывают метод Info, чтобы добавить свой язык программирования: [ID] [Name] ([Language])
  • main.go: Считайте данные о сотрудниках из входного потока, создайте одного Manager и одного Developer, затем выведите информацию о каждом сотруднике и рассчитанный бонус.

Будут предоставлены следующие входные данные:

  • Строка 1: ID менеджера
  • Строка 2: Имя менеджера
  • Строка 3: Базовая зарплата менеджера (float64)
  • Строка 4: Размер команды менеджера (integer)
  • Строка 5: ID разработчика
  • Строка 6: Имя разработчика
  • Строка 7: Базовая зарплата разработчика (float64)
  • Строка 8: Язык программирования разработчика

Для каждого сотрудника выведите его информацию, а затем его бонус на следующей строке. Форматируйте бонусы с двумя знаками после запятой.

Например, при вводе M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 и Go, ваш вывод должен быть следующим:

M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00

Обратите внимание, как расчет бонуса менеджера (20% от 80000 + 5×100 = 16500) отличается от стандартного 10% бонуса разработчика, в то время как разработчик настраивает способ отображения своей информации. Оба типа по-прежнему имеют доступ к встроенным полям Employee и могут вызывать оригинальные методы при необходимости.

Попробуйте сами

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Чтение данных менеджера
	managerID, _ := reader.ReadString('\n')
	managerID = strings.TrimSpace(managerID)

	managerName, _ := reader.ReadString('\n')
	managerName = strings.TrimSpace(managerName)

	managerSalaryStr, _ := reader.ReadString('\n')
	managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)

	teamSizeStr, _ := reader.ReadString('\n')
	teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))

	// Чтение данных разработчика
	devID, _ := reader.ReadString('\n')
	devID = strings.TrimSpace(devID)

	devName, _ := reader.ReadString('\n')
	devName = strings.TrimSpace(devName)

	devSalaryStr, _ := reader.ReadString('\n')
	devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)

	devLanguage, _ := reader.ReadString('\n')
	devLanguage = strings.TrimSpace(devLanguage)

	// TODO: Создайте Manager, используя считанные значения
	// Подсказка: используйте композицию — Manager встраивает Employee

	// TODO: Создайте Developer, используя считанные значения
	// Подсказка: используйте композицию — Developer встраивает Employee

	// TODO: Выведите информацию о менеджере и бонус (бонус отформатирован до 2 знаков после запятой)
	// Используйте fmt.Printf с "%.2f" для форматирования

	// TODO: Выведите информацию о разработчике и бонус (бонус отформатирован до 2 знаков после запятой)
}

Все уроки раздела Объектно-ориентированное программирование