2017-02-14 3 views
3

나는 HuffmanTree를 구축하는 데 도움이 될만한 것을 찾는 웹을 찾고 있었는데이 코드를 우연히 발견했다. http://rosettacode.org/wiki/Huffman_coding#Java.Java - Tree가 Node의 인스턴스입니까?

나는 Java에 익숙하지 않고 이것을 내 수준보다 높게 사용할 수는 없지만 (그와 같은 짧고 겉으로보기에 효과적인 코드이기 때문에) 나는 여전히 흥미를 끈다. 그리고 그것을 통해 읽으려고했다. 적어도 대부분의 것을 이해하기를 바랬습니다 (참고 : 실패했습니다).
그러나 "instanceof"방법에주의를 기울이는 코드가있었습니다.

내 코드에는 3 개의 클래스가 있습니다.
한 슈퍼 클래스 (HuffmanTree)과 두 개의 서브 클래스 (HuffmanNode 및 HuffmanLeaf)과 같이 : 나는 "instanceof를"그리고 지금까지 내가 그것을 이해, 그것은 대상 여부를 알려줍니다 대해 조금 읽어

abstract class HuffmanTree implements Comparable<HuffmanTree> { 
    public final int frequency; // the frequency of this tree 
    public HuffmanTree(int freq) { frequency = freq; } 

    // compares on the frequency 
    public int compareTo(HuffmanTree tree) { 
     return frequency - tree.frequency; 
    } 
} 

class HuffmanLeaf extends HuffmanTree { 
    public final char value; // the character this leaf represents 

    public HuffmanLeaf(int freq, char val) { 
     super(freq); 
     value = val; 
    } 
} 

class HuffmanNode extends HuffmanTree { 
    public final HuffmanTree left, right; // subtrees 

    public HuffmanNode(HuffmanTree l, HuffmanTree r) { 
     super(l.frequency + r.frequency); 
     left = l; 
     right = r; 
    } 
} 

부울을 반환하는 특정 클래스의 인스턴스입니다 (true 또는 false).
논리적으로 상위는 하위의 인스턴스가 될 수 없습니다.

그러나 (tree instanceof HuffmanNode)를 쓰면 true를 반환하고 (트리는 HuffmanTree 클래스의 객체 임), 쓰면 (트리 instanceof HuffmanLeaf) false (논리적으로)를 반환합니다.
그러나 트리가 HuffmanNode의 부모 일 때 (tree instanceof HuffmanNode) true를 반환합니까?

+0

'tree' 객체는 정적 유형의'HuffmanTree'를 가질 수 있습니다 만,'HuffmanTree'는'abstract'이므로 동적 유형 ('instanceof'가 사용하는 것)이 될 수 없습니다. –

+0

이 패턴에주의 깊게주의하십시오. 이것은 재귀 적 정의의 엄청난 힘입니다. 이진 트리의 모든 노드는 그 자체가 이진 트리입니다. 두 개의 자식이 있기 때문입니다. 잎 노드는 아직 자식이없는 트리입니다 (아직). 따라서 트리의 모든 노드는 동시에 노드 (값을 보유하고 있음)와 트리입니다. 매우 큰 규모의 소프트웨어 개발 (심지어 수학)이이 기초 위에 놓여 있습니다. –

+0

그러나,'instanceof'는 코드 타입의 냄새입니다. 올바른 타입 분류법 대신 너무 자주 사용됩니다. –

답변

3

논리적으로, Tree은 자식으로 2 개의 Tree 참조를 갖는 간단히 Node입니다.

트리가 HuffmanNode의 부모 일 때 (tree instanceof HuffmanNode) true를 반환하는 이유는 무엇입니까? 왜?! (당신이 본대로)

treeHuffmanNode해야하며, 예, 어떤 HuffmanNode는 (자신이 노드 나 잎 될 수 있습니다) 다른 두 HuffmanTree 인스턴스의 부모입니다.

그러나 HuffmanNode은 ... 설명하는HuffmanTree

class HuffmanNode extends HuffmanTree { // <----- 
    public final HuffmanTree left, right; // subtrees 

입니다

이 확실하지 그러나 (HuffmanNode instanceof를 나무)

, 쓰기

...

나무는 다음과 같은 방법을 선언해야합니다 의미 HuffmanTreeabstract입니다 HuffmanTree

때문에 클래스의 객체이기 때문에, 당신이 할 수없는 new 추상적 예를

HuffmanTree tree = new HuffmanNode(...); 
        ^^^^ This is the object's type 

(개인적으로 리프 클래스는 두 개의 null 하위 트리가있는 노드 여야합니다)

+0

흥미 롭다. 그러나 나는 추상적 클래스가 어떻게 작동하는지, 왜 사용되는지 이해하지 못한다. HuffmanTree 클래스가 abstract가 아니면 구문이 true를 반환합니까? 또한 게시물의 하단에있는 코드가 흥미 롭습니다. 이전 문장 ("tree"이전)이 HuffmanTree 유형이어야한다고 말하면 어떻게 "new HuffmanNode()"로 선언 할 수 있습니까? – Schytheron

+0

예, '추상적'을 읽어주십시오. 당신을 도울 수있는 충분한 자원이 있습니다. Abstract는'instanceof'의 반환 값을 제어하지 않습니다. 그렇다면'extends' 키워드는 그것을 처리합니다. 제 요점은 당신이'추상 클래스 '를'new' 할 수 없다는 것입니다, 그래서 ** 당신의 질문에 보여주지 못한 코드에서 **'새로운 HuffmanNode()'이어야합니다. 바라건대 이러한 도움말 http://stackoverflow.com/a/9552547/2308683 및 http://stackoverflow.com/questions/11007459/why-assign-a-new-arraylist-to-a-list-variable –

관련 문제