using System.Collections.Generic;
public abstract class Person {
public abstract bool Pass(IVisitorValidator validator);
public class Child: Person {
public int Age { get;set;}
public override bool Pass(IVisitorValidator validator){
return validator.Validate(this);
public class Adult: Person {
public bool IsStudent { get;set;}
public override bool Pass(IVisitorValidator validator){
return validator.Validate(this);
public class Senior: Person{
public bool IsVeteran { get; set; }
public override bool Pass(IVisitorValidator validator){
return validator.Validate(this);
public abstract class IVisitorValidator {
public decimal Money {get; set;}
public int Count {get;set;}
public abstract bool Validate(Child child);
public abstract bool Validate(Adult child);
public abstract bool Validate(Senior child);
public bool IsValid(Person person){
public class BusVisitorValidator: IVisitorValidator {
public override bool Validate(Child child){
if(child.Age > 7) Money +=2;
public override bool Validate(Adult adult){
Money += adult.IsStudent ? 2 : 2.5M;
public override bool Validate(Senior senior){
if(!senior.IsVeteran) Money += 2;
public static void Main()
var queue = new List<Person>()
new Adult(){IsStudent = true},
new Senior(){IsVeteran = true}
var busValidator = new BusVisitorValidator();
foreach (var person in queue)
person.Pass(busValidator);
Console.WriteLine("People: " + busValidator.Count);
Console.WriteLine("Amount: $" + busValidator.Money);