Загрузка данных


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();
        }
    }
}