Загрузка данных
using System;
using System.Collections.Generic;
namespace CompanyApp
{
// 1. Делегат для события
public delegate void SalaryDelegate(double salary);
// 2. Интерфейсы
public interface IWorker
{
int StaminaLeft { get; set; }
void Work();
}
public interface ISalary
{
double Money { get; set; }
double Salary { get; }
event SalaryDelegate SalaryIncomeEvent;
void GetSalary();
}
// 3. Базовые классы
public class Human
{
public string Name { get; set; }
public int Age { get; set; }
public Human()
{
Name = "Неизвестно";
Age = 0;
}
public Human(string name, int age)
{
Name = name;
Age = age;
}
}
// 4. Класс Worker (Рабочий)
public class Worker : Human, IWorker, ISalary
{
public int StaminaLeft { get; set; }
public double Money { get; set; }
// В диаграмме указано <<init>>, значит задается только при создании
public double Salary { get; init; }
public event SalaryDelegate SalaryIncomeEvent;
public Worker(string name, int age, int staminaLeft, double money, double salary)
: base(name, age)
{
StaminaLeft = staminaLeft;
Money = money;
Salary = salary;
}
// Конструктор по умолчанию (на случай если понадобится)
public Worker() : base()
{
StaminaLeft = 100;
Money = 1000;
Salary = 50;
}
public void Work()
{
if (StaminaLeft > 0)
{
Console.WriteLine($"{Name} is working");
StaminaLeft--;
}
else
{
Console.WriteLine($"{Name} is too tired to work");
}
}
public void GetSalary()
{
Console.WriteLine($"{Name} received a income of {Salary}");
Money += Salary;
// Вызываем событие, если на него подписались
SalaryIncomeEvent?.Invoke(Salary);
}
}
// 5. Класс Intern (Стажер)
public class Intern : Human, IWorker
{
public int StaminaLeft { get; set; }
public Intern(string name, int age, int staminaLeft) : base(name, age)
{
StaminaLeft = staminaLeft;
}
// Конструктор по умолчанию для соответствия диаграмме
public Intern() : base()
{
StaminaLeft = 50;
}
public void Work()
{
if (StaminaLeft > 0)
{
Console.WriteLine($"{Name} is working");
StaminaLeft--;
}
else
{
Console.WriteLine($"{Name} is too tired to work");
}
}
}
// 6. Класс Shareholder (Акционер)
public class Shareholder : Human, ISalary
{
public double Money { get; set; }
public double Salary { get; init; }
public event SalaryDelegate SalaryIncomeEvent;
public Shareholder(string name, int age, double salary, double money)
: base(name, age)
{
Salary = salary;
Money = money;
}
public Shareholder() : base()
{
Money = 10000;
Salary = 100;
}
public void GetSalary()
{
Console.WriteLine($"{Name} received a income of {Salary}");
Money += Salary;
SalaryIncomeEvent?.Invoke(Salary);
}
}
// 7. Статический класс Company (Компания)
public static class Company
{
public static void PaySalaries(List<ISalary> employees)
{
foreach (var employee in employees)
{
employee.GetSalary();
}
}
public static void WorkEmployees(List<IWorker> employees)
{
foreach (var employee in employees)
{
employee.Work();
}
}
public static void BankCreditsSubscribe(List<ISalary> employees)
{
foreach (var employee in employees)
{
// "Привязывает простейший метод, который в консоль выводит сообщение"
employee.SalaryIncomeEvent += (salary) =>
{
Console.WriteLine($"Received salary: {salary}");
};
}
}
}
// 8. Демонстрация работы (Main)
class Program
{
static void Main(string[] args)
{
// Создаем сотрудников
Worker worker1 = new Worker("Иван", 25, 100, 5000, 1500);
Intern intern1 = new Intern("Алексей", 19, 50);
Shareholder shareholder1 = new Shareholder("Олег", 45, 5000, 100000);
// Списки для методов компании
List<IWorker> workers = new List<IWorker> { worker1, intern1 };
List<ISalary> salaryReceivers = new List<ISalary> { worker1, shareholder1 };
Console.WriteLine("--- 1. Подписка на банковские кредиты ---");
Company.BankCreditsSubscribe(salaryReceivers);
Console.WriteLine("\n--- 2. Рабочий процесс ---");
Company.WorkEmployees(workers);
Company.WorkEmployees(workers); // Еще раз, чтобы увидеть уменьшение стамины
Console.WriteLine("\n--- 3. Выплата зарплат ---");
Company.PaySalaries(salaryReceivers);
Console.ReadLine();
}
}
}