To go further than the other answer, you can use a template.
First create the IVisitorClient and IVisitor .
interface IVisitorClient { Accept(IVisitor visitor); } interface IVisitor { Visit(SceneObject o);
Make your other IVisitorClient object.
abstract class SceneObject : IVisitorClient { public virtual void Accept(IVisitor visitor) { visitor.Visit(this); } } class Portal : SceneObject { ... public override void Accept(IVisitor visitor) { visitor.Visit(this); } ... } class Enemy: SceneObject { ... public override void Accept(IVisitor visitor) { visitor.Visit(this); } ... }
Then create an update that implements IVisitor :
class UpdaterVisitor : IVisitor { readonly Player player; readonly Time time; public UpdaterVisitor(Player player, Time time) { this.player = player; this.time = time; } public void Visit(SceneObject o) { e.Update(time); } public void Visit(Enemy e) { e.Update(time, player); } public void Visit(Portal p) { p.Interact(ref player, player.Interact); } }
Finally, to update the object, the code will look like this.
var updateVisitor = new UpdaterVisitor(player, time); foreach(var o in objects) { o.Accept(updateVisitor); }
Orece source share