Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Patronski/156ada3bbd67c1876db9abf9cf1d5aef to your computer and use it in GitHub Desktop.
Save Patronski/156ada3bbd67c1876db9abf9cf1d5aef to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
public abstract class Employee
{
protected Employee(string name, int workHoursPerWeek)
{
this.Name = name;
this.WorkHoursPerWeek = workHoursPerWeek;
}
public string Name { get; set; }
public int WorkHoursPerWeek { get; set; }
}
public class StandartEmployee : Employee
{
private const int workHoursPerWeek = 40;
public StandartEmployee(string name)
: base(name, workHoursPerWeek)
{
}
}
public class PartTimeEmployee : Employee
{
private const int workHoursPerWeek = 20;
public PartTimeEmployee(string name)
: base(name, workHoursPerWeek)
{
}
}
public delegate void JobUpdateHandler(object sender, JobDoneEventArgs e);
public class Job
{
public Job(string name, int workHoursRequired, Employee employee)
{
this.Name = name;
this.WorkHoursRequired = workHoursRequired;
this.Employee = employee;
}
public string Name { get; set; }
public int WorkHoursRequired { get; set; }
public Employee Employee { get; set; }
public void Update()
{
this.WorkHoursRequired -= this.Employee.WorkHoursPerWeek;
if (this.WorkHoursRequired <= 0)
{
Console.WriteLine("Job {0} done!", this.Name);
this.OnJobUpdate(new JobDoneEventArgs(this));
}
}
public event JobUpdateHandler JobUpdate;
public void OnJobUpdate(JobDoneEventArgs e)
{
this.JobUpdate?.Invoke(this, e);
}
public override string ToString()
{
return $"Job: {this.Name} Hours Remaining: {this.WorkHoursRequired}";
}
}
public class JobDoneEventArgs : EventArgs
{
public JobDoneEventArgs(Job job)
{
this.Job = job;
}
public Job Job { get; set; }
}
public class ModifiedList : List<Job>
{
public void HandleJobCompletion(object sender, JobDoneEventArgs e)
{
this.Remove(e.Job);
}
}
public class WorkForce
{
static void Main()
{
ModifiedList jobs = new ModifiedList();
Dictionary<string, Employee> employeesByName = new Dictionary<string, Employee>();
string input = Console.ReadLine().Trim();
while (input != "End")
{
string[] inputArgs = input.Split();
switch (inputArgs[0])
{
case "StandartEmployee":
var standartEmployee = new StandartEmployee(inputArgs[1]);
employeesByName[inputArgs[1]] = standartEmployee;
break;
case "PartTimeEmployee":
var partTimeEmployee = new PartTimeEmployee(inputArgs[1]);
employeesByName[inputArgs[1]] = partTimeEmployee;
break;
case "Job":
var employee = employeesByName[inputArgs[3]];
var job = new Job(inputArgs[1], int.Parse(inputArgs[2]), employee);
job.JobUpdate += jobs.HandleJobCompletion;
jobs.Add(job);
break;
case "Pass":
List<Job> jobsToUpdate = new List<Job>(jobs);
foreach (var jobToUpdate in jobsToUpdate)
{
jobToUpdate.Update();
}
break;
case "Status":
foreach (var jobNumberTwo in jobs)
{
Console.WriteLine(jobNumberTwo);
}
break;
}
input = Console.ReadLine();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment