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