2010-08-15 5 views
5

트리 (또는 문제를 해결하기 위해 가질 필요가있는 다른 객체)에 대해 공통 클래스를 정의해야한다고 가정 해 봅시다. 우리의 클래스 구조는 꽤 복잡 할 수 있기 때문에, 정의 후에 클래스 메소드를 정의하는 것을 선호합니다. 우리의 일반적인 클래스 BaseTree 우리의 특정 클래스 Tree 중 하나가 클래스 구조를 정의한 후 Ruby 클래스 상속 및 증분 정의

class BaseTree 
    class BaseNode; end 
    class NodeA < BaseNode; end 
end 

class Container 
    class Tree < BaseTree; end 
end 

을, 우리는 모든 노드에 대해 #initialize을 설정합니다. 우리가 그것을 테스트하는 경우 그 후 우리는 다음과 같은 방법으로 방법을 추가하는 경우

class BaseTree::BaseNode 
    def initialize x 
    p x 
    end 
end 

후 모든,

Container::Tree::NodeA.new(1) 
# => 1 

그러나 괜찮습니다 다음은 NodeA을 사이에 상속을 중단

class Container::Tree::NodeA 
    def some_method; end 
end 

BaseNode !!

이 문제를 해결하기 위해
Container::Tree::NodeA.new(2) 
# ~> -:30:in `initialize': wrong number of arguments(1 for 0) (ArgumentError) 

, 우리는 명시 적으로 정의 할 필요가

class Container 
    class Tree < BaseTree 
    class NodeA < BaseNode; end # explicit inheritance 
    end 
end 

class Container::Tree::NodeA 
    def some_method; end 
end 

또는

class Container::Tree::NodeA < Container::Tree::BaseNode 
    def some_method; end 
end 

class Container::Tree::NodeA < BaseTree::BaseNode 
    def some_method; end 
end 

마지막 방법은 한 번만 사용 할 필요가있는 다음과 같은 방법에 의해

- 첫번째 메소드를 추가 할 때, 나중에 정의를 위해 부모 클래스를 건너 뛸 수 있습니다.

class Container::Tree::NodeA 
    def another_method; end 
end 

그 후에는 잘 작동하지만 특히 나무 유형이 많고 노드가 다른 경우에는 상당히 번거로 웠습니다.

그런 정의를하는 더 우아한 방법이 있습니까?

+0

을 어쩌면 코어가 ping되어 이것이 예상되는지 알 수 없습니다. – rogerdpack

+0

왜 네임 스페이스 용 클래스를 사용하는지 이해할 수 없지만 모듈이있을 것으로 예상됩니다. 바인딩의 불일치가있는 것 같지만 여기서 문제를 이해하지 못합니다. 그런데 클래스 메서드를 정의하지 않고 인스턴스 메서드를 정의합니다. – mliebelt

답변

2

루비에서 코드를 구성하는 방법은 모듈을 네임 스페이스로 사용하고 하위 클래스 및 상속 동작에 대한 클래스 상속을 사용하는 것입니다. 나는 루비가 네임 스페이스 상속을 지원한다고 생각하지 않는다. (기본적으로 Tree는 BaseTree로부터 상속 받고 TreeAn : NodeA로 NodeA를 참조한다고 말하면서 바인딩을 올바르지 않은 이상한 엣지 케이스로 간주한다.

어쨌든 내가 제시 한 방식으로 코드를 구성해야하는 유효한 시나리오가 있다고 생각하지 않습니다. '적절한'방법은 네임 스페이스를 정의하는 모듈과 동작을 정의하는 클래스를 통해이를 구성하는 것입니다.

그래서, 하나 하나 단순히 이름 충돌이 내 수업에서 그들을 구별 네임 스페이스 또는 네임 스페이스없이, 단지 클래스를 선언 등의 트리를 정의하여 갈 것입니다 방법 :

module UserInterface 
    class Container; end 

    class Tree; end 

    class BaseTree < Tree; end 

    class BaseNode; end 

    class NodeA < BaseNode; end 
end 


module DataStructures 
    class Tree; end 

    class RedBlackTree < Tree; end 
end