namespace MethodOverloading
public interface IMessageVisitor
void Accept(Message1000 msg);
void Accept(Message2000 msg);
public abstract class MessageBase
public readonly string Value;
public MessageBase() { Value = GetType().Name; }
public abstract void Visit(IMessageVisitor visitor);
public class Message1000 : MessageBase
public override void Visit(IMessageVisitor visitor) => visitor.Accept(this);
public class Message2000 : MessageBase
public override void Visit(IMessageVisitor visitor) => visitor.Accept(this);
public interface IHandler
void ReceiveMessage(MessageBase msg);
public class Handler1 : IHandler, IMessageVisitor
public void ReceiveMessage(MessageBase msg) => msg.Visit(this);
public void Accept(Message1000 msg) => Console.WriteLine("Message1000");
public void Accept(Message2000 msg) => Console.WriteLine("Message2000");
static void Main(string[] args)
Message1000 msg1000 = new Message1000();
Message2000 msg2000 = new Message2000();
Console.WriteLine("Handler1:");
Handler1 handler1 = new Handler1();
handler1.ReceiveMessage(msg1000);
handler1.ReceiveMessage(msg2000);