using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
var objA = new ObjA();
var objB = new ObjB();
var visitorA = new VisitorA();
var visitorB = new VisitorB();
Test(objA, visitorA);
Test(objA, visitorB);
Test(objB, visitorA);
Test(objB, visitorB);
}
static void Test(IObj obj, AVisitor visitor)
{
visitor.Foo(obj);
}
}
interface IObj
{
void Say();
}
public class ObjA : IObj
{
public void Say()
{
Console.WriteLine("ObjA Say...");
}
}
public class ObjB : IObj
{
public void Say()
{
Console.WriteLine("ObjB Say...");
}
}
abstract class AVisitor
{
public void Foo<T>(T obj) where T : IObj
{
dynamic dObj = obj;
Foo(dObj);
}
protected abstract void Foo(ObjA obj);
protected abstract void Foo(ObjB obj);
}
class VisitorA : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
}
class VisitorB : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
}
}
namespace Test
{
class Program
{
static void Main(string[] args)
{
var objA = new ObjA();
var objB = new ObjB();
var visitorA = new VisitorA();
var visitorB = new VisitorB();
Test(objA, visitorA);
Test(objA, visitorB);
Test(objB, visitorA);
Test(objB, visitorB);
}
static void Test(IObj obj, AVisitor visitor)
{
visitor.Foo(obj);
}
}
interface IObj
{
void Say();
}
public class ObjA : IObj
{
public void Say()
{
Console.WriteLine("ObjA Say...");
}
}
public class ObjB : IObj
{
public void Say()
{
Console.WriteLine("ObjB Say...");
}
}
abstract class AVisitor
{
public void Foo<T>(T obj) where T : IObj
{
dynamic dObj = obj;
Foo(dObj);
}
protected abstract void Foo(ObjA obj);
protected abstract void Foo(ObjB obj);
}
class VisitorA : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
}
class VisitorB : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
}
}