Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Usage
- {
- public Usage()
- {
- var foo = new Foo();
- var count = foo.Accept(new CountVisitor());
- var name = foo.Accept(new NameVisitor());
- var barCount = new Bar().Accept(new CountVisitor());
- var barName = new Bar().Accept(new NameVisitor()); // doesn't work cuz Bar is not IVisitable<string> = can't accept IVisitor<string>
- }
- }
- public class Foo : IVisitable<int, Foo>, IVisitable<string, Foo>
- {
- public int Accept(IVisitor<int, Foo> visitor) => visitor.Visit(this);
- public string Accept(IVisitor<string, Foo> visitor) => visitor.Visit(this);
- }
- public class Bar : IVisitable<int, Bar>
- {
- public int Accept(IVisitor<int, Bar> visitor) => visitor.Visit(this);
- }
- public class CountVisitor : IVisitor<int, Foo>, IVisitor<int, Bar>
- {
- public int Visit(Foo visitable) => 42;
- public int Visit(Bar visitable) => 32;
- }
- public class NameVisitor : IVisitor<string, Foo>
- {
- public string Visit(Foo visitable) => "yolo";
- }
- public interface IVisitable<TResult, out TVisitable> where TVisitable : IVisitable<TResult, TVisitable>
- {
- TResult Accept(IVisitor<TResult, TVisitable> visitor);
- }
- public interface IVisitor<out TResult, in TVisitable> where TVisitable : IVisitable<TResult, TVisitable>
- {
- TResult Visit(TVisitable visitable);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement