using System.Collections.Generic;
public class Program : IPersonVisitor
public static void Main()
var persons = new List<IPerson>();
persons.Add(new NaturalPerson());
persons.Add(new LegalPerson());
public void Process(IEnumerable<IPerson> persons)
foreach( var person in persons )
public void VisitedBy( NaturalPerson p )
Console.WriteLine("It's a natural person!");
public void VisitedBy( LegalPerson p )
Console.WriteLine("It's a legal person!");
void Visit(IPersonVisitor v);
public class NaturalPerson : IPerson
public void Visit(IPersonVisitor v)
public class LegalPerson : IPerson
public void Visit(IPersonVisitor v)
public interface IPersonVisitor
void VisitedBy( NaturalPerson p );
void VisitedBy( LegalPerson p );