2014-07-10 5 views
0

는 :C# this.Equals (typeof (...)); 내가 코드 조각 다음 한

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)); 
    } 
} 

벽과 바닥 클래스 모두 타일에서 상속합니다.

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

타일은 타일 클래스의 2 차원 배열과 바닥 또는 중 하나를 초기화됩니다 그 내용은 다음과 같습니다 프로그램의 또 다른 시점에서 예를 들어 다음과 같이가는 경우 문이 벽. 따라서 타일이 벽인 경우 Digable이며 true를 반환해야하지만 항상 false를 반환하므로 다른 코드를 실행하지 않습니다. 나는 C#에 익숙하지 않기 때문에 나는 뭔가 잘못된 구문을 사용하고 있다고 생각한다. 두 값이, 예를 들면, (어떤 방법) Floor 동일 유형의 두 변수는 메모리의 동일한 인스턴스를 참조하는 경우 테스트하는 경우

답변

6

Equals 방법은 테스트이다. 객체가 특정 유형의 경우

is operator 사용, 테스트하려면 :

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

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

또는 같은 로템 당신은 그들을 isDigableisGroundvirtual 방법을 확인하기 위해 클래스를 수정하고 override 수 있으며, 제안 당신의

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; 
    } 
} 
+3

정상적인 방법은'isDigable'과'isGround' 가상을 만들고'Wall'과'Floor'를 오버라이드시키는 것입니다. 쓰여졌 듯이,'Tile'은 모든 서브 클래스를 알아야합니다. – Rotem

+0

완벽하고, 일하고, 고마워! @ 로템 알아요.하지만 이런 식으로 할 이유가 있습니다. – Skyswimsky

+0

@Rotem 좋은 제안. 나는 완성을 위해 그런 해결책을 포함시켰다. –