Advertisement
Guest User

Untitled

a guest
Aug 15th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. public class Usage
  2. {
  3. public Usage()
  4. {
  5. var foo = new Foo();
  6. var count = foo.Accept(new CountVisitor());
  7. var name = foo.Accept(new NameVisitor());
  8.  
  9. var barCount = new Bar().Accept(new CountVisitor());
  10. var barName = new Bar().Accept(new NameVisitor()); // doesn't work cuz Bar is not IVisitable<string> = can't accept IVisitor<string>
  11. }
  12. }
  13.  
  14. public class Foo : IVisitable<int, Foo>, IVisitable<string, Foo>
  15. {
  16. public int Accept(IVisitor<int, Foo> visitor) => visitor.Visit(this);
  17. public string Accept(IVisitor<string, Foo> visitor) => visitor.Visit(this);
  18. }
  19.  
  20. public class Bar : IVisitable<int, Bar>
  21. {
  22. public int Accept(IVisitor<int, Bar> visitor) => visitor.Visit(this);
  23. }
  24.  
  25. public class CountVisitor : IVisitor<int, Foo>, IVisitor<int, Bar>
  26. {
  27. public int Visit(Foo visitable) => 42;
  28. public int Visit(Bar visitable) => 32;
  29. }
  30.  
  31. public class NameVisitor : IVisitor<string, Foo>
  32. {
  33. public string Visit(Foo visitable) => "yolo";
  34. }
  35.  
  36. public interface IVisitable<TResult, out TVisitable> where TVisitable : IVisitable<TResult, TVisitable>
  37. {
  38. TResult Accept(IVisitor<TResult, TVisitable> visitor);
  39. }
  40.  
  41. public interface IVisitor<out TResult, in TVisitable> where TVisitable : IVisitable<TResult, TVisitable>
  42. {
  43. TResult Visit(TVisitable visitable);
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement