public abstract class Client
public string Name { get; set; }
public string Email { get; set; }
public int? Age { get; set; }
public bool accessDisabled { get; set; }
public IAccessHandler AccessHandler { get; set; }
public virtual bool HandleAccess()
return AccessHandler.getAccess();
public class User : Client
public int Reputation { get; set; }
AccessHandler = new HasReputation();
public override bool HandleAccess()
return AccessHandler.getAccess(Reputation, accessDisabled);
public class Manager : Client
AccessHandler = new HasAccessAutomatic();
public override bool HandleAccess()
return AccessHandler.getAccess(accessDisabled: accessDisabled);
public class Admin : Client
AccessHandler = new HasAccessAutomatic();
public override bool HandleAccess()
return AccessHandler.getAccess(accessDisabled: accessDisabled);
public interface IAccessHandler
public bool getAccess(int? Reputation = 0, bool accessDisabled = false);
public class HasReputation : IAccessHandler
public bool getAccess(int? Reputation = 0, bool accessDisabled = false)
if (Reputation < 20 || accessDisabled == true)
public class HasAccessAutomatic : IAccessHandler
public bool getAccess(int? Reputation = 0, bool accessDisabled = false)
static void Main(string[] args)
User lowRepUser = new User() { Reputation = 7, accessDisabled = false };
User highRepBannedUser = new User() { Reputation = 53, accessDisabled = true };
User accessUser = new User() { Reputation = 31, accessDisabled = false };
Admin admin = new Admin() { accessDisabled = false };
Manager manager = new Manager() { accessDisabled = false };
Manager managerDisabled = new Manager() { accessDisabled = true };
Console.WriteLine($"User access: {lowRepUser.HandleAccess()}");
Console.WriteLine($"User access: {highRepBannedUser.HandleAccess()}");
Console.WriteLine($"User access: {accessUser.HandleAccess()}");
Console.WriteLine($"Admin access: {admin.HandleAccess()}");
Console.WriteLine($"Manager access: {manager.HandleAccess()}");
Console.WriteLine($"Manager access: {managerDisabled.HandleAccess()}");