0

次のコードがあります。

class Tile
{
    public TCODColor color { get; protected set; }
    public int glyph { get; protected set; }

    public Boolean isDigable()
    {
        return this.Equals(typeof(Wall));
    }
    public Boolean isGround()
    {
        return this.Equals(typeof(Floor));
    }
}

Wall クラスと Floor クラスはどちらも Tile を継承しています。プログラムの別の時点で、たとえば次のような if ステートメントがあります。

public void dig(int x, int y)
{
    if (tiles[x, y].isDigable())
    {
        tiles[x,y] = new Floor();
    }
}

タイルは Tile クラスの 2 次元配列であり、その内容は Floor または Wall として初期化されます。そのため、タイルが Wall の場合、Digable (および true を返す必要があります) ですが、常に false を返すため、他のコードは実行されません。私は C# に慣れていないので、構文に関して何か間違ったことをしていると思いますが、何か提案はありますか?

4

1 に答える 1

6

このEqualsメソッドは、2 つの値が (何らかの方法で) 等しいかどうかをテストするためのものです。たとえば、型の 2 つの変数がFloorメモリ内の同じインスタンスを参照しているかどうかをテストします。

オブジェクトが特定のタイプであるかどうかをテストするには、is演算子を使用します。

public Boolean isDigable()
{
    return this is Wall;
}

public Boolean isGround()
{
    return this is Floor;
}

または、Rotemが示唆するように、次のように、クラスを makeisDigableおよびisGround 仮想メソッドに変更し、子クラスでそれらをオーバーライドすることができます。

class Tile
{
    public TCODColor color { get; protected set; }
    public int glyph { get; protected set; }

    public virtual bool isDigable() 
    { 
        return false; 
    }

    public virtual bool isGround() 
    { 
        return false; 
    }
}

class Wall: Tile
{
    public override bool isDigable()
    { 
        return true; 
    }
}

class Floor : Tile
{
    public override bool isGround()
    { 
        return true; 
    }
}
于 2014-07-10T15:37:56.267 に答える