C#this.Equals(typeof(...));

Sky*_*sky 0 c# typeof this equals-operator

我有以下代码:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

Wall和Floor类都继承自Tile.在程序的另一个点上,我有一个if语句,例如:

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

tile是Tile类的二维数组,它们的内容被初始化为Floor或Wall.因此,如果tile是Wall,它是Digable(并且应该返回true)但是无论它总是返回false,因此,不执行其他代码.由于我不熟悉C#,我想我做错了.语法明智,有什么建议吗?

p.s*_*w.g 6

Equals方法用于测试两个值是否相等(以某种方式),例如,测试两个类型的变量是否Floor引用内存中的相同实例.

要测试对象是否属于某种类型,请使用is运算符:

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

public Boolean isGround()
{
    return this is Floor;
}
Run Code Online (Sandbox Code Playgroud)

或者正如Rotem公司建议,你可以修改你的类,使isDigableisGround 虚拟方法和重写他们在你的子类,如下所示:

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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 理智的方法是将`isDigable`和`isGround`虚拟化,并使`Wall`和`Floor`覆盖它们.在编写时,`Tile`必须知道它的所有子类. (3认同)