2009-03-11 6 views
1

현재 각 노드가 다른 노드와 동등한지를 알 수 있어야하는 노드의 트리 구조에 대해 작업하고 있습니다. 각 노드 클래스는 QueryNode의 서브 클래스입니다. 동등성을 확인하려면, 그들은 같은 서브 클래스이며, 동일한 멤버 값이있는 경우 노드는 비교 (관련된 더 많은 일을 거기 물론,하지만이 버그 나 그 일부) :이되지 않을 수 있습니다 느낄이 C# 코드에서 유형을 검사 할 수있는 대안이 있습니까?

class VersionNode : QueryNode 
{ 
    VersionModifier m_versionModifier; 

    internal VersionModifier VersionModifier 
    { get { return this.m_versionModifier; } } 

    // ... 

    protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     VersionNode otherNodeAsVersionNode = other as VersionNode; 

     if (otherNodeAsVersionNode == null) 
      return false; 
     else 
      return (this.m_versionModifier == otherNodeAsVersionNode.VersionModifier); 
    } 
} 

캐스팅이 필요하기 때문에 최적의 해결책이 될 수 있습니다. 이 일을 더 우아한 방법이 있습니까?

+0

당신이 당신의 탭 크기 2 개 공간을 만들 경우보다 '우아한'모양의 코드 및 지역 변수 이름을 줄이십시오. – leppie

+0

BTW 다른 인스턴스의 m_versionModifier에 직접 액세스 할 수 있습니다. 속성을 통해 갈 필요가 없습니다 :) 'this'도 불필요합니다. – leppie

+0

Paul Graham의 Ansi Common Lisp을 읽은 후 멋진 코드를 선호합니다. –

답변

2

짧은 대답은 아니오입니다. 주조 (심지어 학위에 언 박싱)는 비용이 많이 들지 않습니다.

0

나는 이상한 던지기가 너를 다치게하지 않을 것이라고 확신한다. 뭐하는거야, 물리학 모델링?

+0

데이터베이스 쿼리에 대한 마이너 최적화에 대한 테스트 작성. 당신의 도움을 주셔서 감사합니다! –

+0

그래, 이런 종류의 것은 붉은 청어이다. 당신의 진정한 이익은 다른 곳에 있습니다. – Quibblesome

1

당신은 할 수 :

protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     if (!(other is VersionNode)) 
      return false; 
     ... 
} 
+0

이 속성에 액세스하려면 VersionNode로 "other"를 조작해야하므로 여기서는 도움이되지 않습니다. 안전한 캐스팅 "as"는 좋은 방법입니다. –

+0

계속 하시겠습니까? 그냥 대안으로 던져. 웃긴 점은 'is'와 'as'연산자가 실제로 isinst IL 연산 코드로 구현 되었기 때문에 실제로 차이가 없다는 것입니다. –

0

그것은 우아하지 더 있지만, 아마도 더 명시 적입니다 :

protected override bool AreMembersEquivalent(QueryNode other) 
{ 
    if (GetType() == other.GetType()) 
    { 
     return (VersionModifier == other.VersionModifier); 
    } 
    return false; 
}  
+0

그리고 상속을 위해 작동하지 않습니다. – leppie

+0

무슨 소리 야? 이 코드는 QueryNode에서 상속받은 두 객체가 같은 유형인지 여부를 알려줍니다. –

관련 문제