Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public interface INode
- {
- void Visit(INodeVisitor visitor);
- }
- public interface INodeVisitor
- {
- void VisitContainer(IContainer container);
- }
- public interface IContainer : INode
- {
- }
- class Program
- {
- static void Main(string[] args)
- {
- ContainerVisitor visitor = new ContainerVisitor();
- visitor.VisitContainer(new Container());
- }
- }
- public class ContainerVisitor : INodeVisitor
- {
- public void VisitContainer(IContainer value)
- {
- Container container = value as Container;
- // Do some stuff...
- }
- }
- public class Container : IContainer
- {
- public void Visit(INodeVisitor visitor)
- {
- visitor.VisitContainer(this);
- }
- }
- public class NodeVisitor<T> : INodeVisitor where T : IContainer {
- public void VisitContainer(T node) {
- var container = node as T;
- if ( container != null ) {
- VisitTyped(container);
- }
- }
- protected abstract VisitContainerTyped(T container);
- }
- public class ContainerVisitor : NodeVisitor<Container>{
- protected override void VisitContainerTyped(Container container){
- // Do some stuff...
- }
- }
- INodeVisitor visitor = new ContainerVisitor();
- visitor.VisitContainer(myBespokeContainer);
- public interface IContainer : INode
- {
- void Add(IComponent component);
- void Add(IComponent component, string name);
- void Remove(IComponent component);
- ComponentCollection Components { get; }
- }
- public class ContainerVisitor : INodeVisitor
- {
- public void VisitContainer(IContainer container)
- {
- foreach (IComponent component in container.Components)
- {
- // ...
- }
- }
- }
Add Comment
Please, Sign In to add comment