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


using System;
using System.Collections.Generic;

public delegate void SalaryDelegate(double salary);

public interface IWorker { int StaminaLeft { get; set; } void Work(); }
public interface ISalary { double Money { get; set; } double Salary { get; init; } event SalaryDelegate SalaryIncomeEvent; void GetSalary(); }

public class Human
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Human(string name, int age) { Name = name; Age = age; }
}

public class Worker : Human, IWorker, ISalary
{
    public int StaminaLeft { get; set; }
    public double Money { get; set; }
    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 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);
    }
}

public class Intern : Human, IWorker
{
    public int StaminaLeft { get; set; }
    public Intern(string name, int age, int staminaLeft) : base(name, age) { StaminaLeft = staminaLeft; }

    public void Work()
    {
        if (StaminaLeft > 0) { Console.WriteLine($"{Name} is working"); StaminaLeft--; }
        else Console.WriteLine($"{Name} is too tired to work");
    }
}

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 void GetSalary()
    {
        Console.WriteLine($"{Name} received a income of {Salary}");
        Money += Salary;
        SalaryIncomeEvent?.Invoke(Salary);
    }
}

public static class Company
{
    public static void PaySalaries(List<ISalary> employees) { foreach (var e in employees) e.GetSalary(); }
    public static void WorkEmployees(List<IWorker> employees) { foreach (var e in employees) e.Work(); }
    
    public static void BankCreditsSubscribe(List<ISalary> employees)
    {
        foreach (var e in employees) e.SalaryIncomeEvent += s => Console.WriteLine($"Received salary: {s}");
    }
}