我尝试了解双重调度和访问者模式,但下面的代码显然是错误的。我必须错过明显的东西,但我不知道如何解决它。任何人都可以照亮我吗?我不知道如何在访问者中添加具体的实例,我应该在具体的访问者类中创建一个构造函数吗?访客模式的实现。小行星/太空飞船碰撞问题
interface Collidable
{
void Accept(IVisitor other);
}
class Asteroid : Collidable
{
public void Accept(IVisitor other)
{
Console.Write("[Asteroid] ");
other.visitAsteroid(this);
}
}
class Spaceship : Collidable
{
public void Accept(IVisitor other)
{
Console.Write("[Spaceship] ");
other.visitSpaceship(this);
}
}
interface IVisitor
{
void visitAsteroid(Asteroid a);
void visitSpaceship(Spaceship s);
}
class CollisionWithAsteroidVisitor : IVisitor
{
public void visitAsteroid(Asteroid a)
{
Console.WriteLine("Collided with asteroid");
}
public void visitSpaceship(Spaceship s)
{
Console.WriteLine("Collided with asteroid");
}
}
class CollisionWithSpaceShipVisitor : IVisitor
{
public void visitAsteroid(Asteroid a)
{
Console.WriteLine("Collided with spaceship");
}
public void visitSpaceship(Spaceship s)
{
Console.WriteLine("Collided with spaceship");
}
}
static void Main(string[] args)
{
Asteroid a1 = new Asteroid();
Asteroid a2 = new Asteroid();
Spaceship s1 = new Spaceship();
Spaceship s2 = new Spaceship();
s1.Accept(new CollisionWithAsteroidVisitor()); // this must be wrong
s1.Accept(new CollisionWithSpaceShipVisitor()); // this must be wrong
}
这段代码为什么会出错?你有没有试过编译它?在C#中,如果不指定构造函数,编译器将为您定义一个空的默认构造函数,并且您标记的行完全合法。据我所见,此代码的工作原理和行为如预期。 – buc 2012-01-15 13:12:29
@buc问题是我想让特定的两个对象相互碰撞。例如使s1飞船与a1小行星相撞,或者s1飞船与a2小行星相撞等等。用RTTI很容易实现,但在这里我必须做错事。 – Firkraag 2012-01-15 13:34:40
在这种情况下,您的对象必须表现为接受者和访问者,具体取决于碰撞到另一个对象的内容。为了实现这一点,他们都必须实现IVisitor接口,并且不需要特定的访问者类。我会在我的答案中显示一个例子... – buc 2012-01-15 13:44:18