트리 (또는 문제를 해결하기 위해 가질 필요가있는 다른 객체)에 대해 공통 클래스를 정의해야한다고 가정 해 봅시다. 우리의 클래스 구조는 꽤 복잡 할 수 있기 때문에, 정의 후에 클래스 메소드를 정의하는 것을 선호합니다. 우리의 일반적인 클래스 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
그 후에는 잘 작동하지만 특히 나무 유형이 많고 노드가 다른 경우에는 상당히 번거로 웠습니다.
그런 정의를하는 더 우아한 방법이 있습니까?
을 어쩌면 코어가 ping되어 이것이 예상되는지 알 수 없습니다. – rogerdpack
왜 네임 스페이스 용 클래스를 사용하는지 이해할 수 없지만 모듈이있을 것으로 예상됩니다. 바인딩의 불일치가있는 것 같지만 여기서 문제를 이해하지 못합니다. 그런데 클래스 메서드를 정의하지 않고 인스턴스 메서드를 정의합니다. – mliebelt