私はダブルディスパッチと訪問者のパターンについて学びますが、次のコードは明らかに間違っています。私は明白な何かを見逃しているに違いないが、私はそれを修正する方法を知らない。誰か私を照らすことができますか?具体的な訪問者クラスにコンストラクタを作成すると、訪問者に具体的なインスタンスを配置する方法がわかりません。私が理解できたよう訪問者パターンの実装。小惑星/宇宙船の衝突の問題
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
@buc問題は、特定の2つのオブジェクトを互いに衝突させたいということです。例えば、s1宇宙船をa1小惑星と衝突させる、s1船をa2小惑星と衝突させるなど。 RTTIで実現するのは非常に簡単ですが、ここでは何か間違っている必要があります。 – Firkraag
この場合、オブジェクトは、他のオブジェクトに何が衝突しているかに応じてアクセプタとビジターの両方として動作する必要があります。これを実現するには、IVisitorインターフェイスを実装する必要があり、特定の訪問者クラスは必要ありません。私は私の答えに例を示します... – buc