2013-04-26 6 views
0

나는Ruby에서 클래스를 확장하는 가장 좋은 방법은 무엇입니까?

module XYZ 
    class A 
    end 
    class B 
    end 
end 

합니까 클래스 C의 상속을 모두 클래스 A와 B 다음 사이의 차이를 이해 할, 또는 내가 <를 사용하여 확장 할 수 있나요?

module YZZ 
include XYZ 
    class C < A 
    end 
end 

다음과 같은 경우 어떻게됩니까? 이제 모든 클래스를 포함합니까, 아니면 클래스 A 만 포함합니까?

module YZZ 
extend XYZ 
    class C < A 
    end 
end 
  • A로부터 C 클래스를 확장하는 가장 좋은 방법은 무엇입니까?
  • 클래스 C를 A와 B 둘 다 사용하여 확장 할 수 있습니까?
  • 어떻게 클래스 A 만 포함시킬 수 있습니까?
+1

두 번째 및 세 번째 코드 블록에있는 항목이 유효한 Ruby가 아닙니다. –

+0

유효하지 않은 내용은 무엇입니까? – amjad

+1

모듈 이름이 없습니다. 'module Hello처럼; 연장 XYZ 끝'. –

답변

0

광고 1. 예, C는 A와 B를 모두 상속 #include를 사용하십시오. #extend는 클래스 메소드에 적용됩니다.

Ad 2. class C < A, A는 단지 상수이며, 인스턴스 클래스의 개체 이 값으로 할당됩니다. 그래서 C는 그 서브 클래스가됩니다.

Ad 3. 'module'문에서 #extend를 사용하면 self이 모듈 자체이며 XYZ 은 기본적으로 sigleton 클래스에 포함됩니다.

마지막 세 개의 글 머리 기호 문제는 처음에는 이해가되지 않습니다. "A 클래스에서 C 클래스 확장"이란 무엇입니까? class C < XYZ::A이 도움이됩니까? 두 번째 글 머리 기호 질문에 대해서는 간단히 C.extend(XYZ)으로 "A와 B 둘 다 사용"C를 확장 할 수 있습니다. "클래스 A 만 포함 할 수있는 방법"에 관해서는 모듈의 일부만 포함하는 간단한 방법은 없습니다. 클래스 A를 별도로 포함시키려는 경우 B가 없어도 해결할 수있는 자체적 인 문제가있는 경우 별도의 모듈에 넣고 포함 시키십시오. 그것은 우려의 분리라고합니다.

module Something 
    A = XYZ::A 
end 

을 그리고 거기 당신은 일정한 뭔가 :: XYZ :: A와 같은 클래스에 포인팅이있다 : 당신은 그냥 벚꽃 선택하려는 경우, 당신은 할 수 있습니다.

+0

감사합니다. Boris. "A 클래스에서 C 클래스를 확장하는 가장 좋은 방법은 무엇입니까?" 나는 의미한다. C amjad

+0

Amjad,'A'와'XYZ :: A' 사이의 선택은'extend'와는 아무런 관련이 없습니다. 루비에서 상수에 액세스하는 것일뿐입니다. 방화 방식은':: XYZ :: A' (일종의'\ xyz \ a')를 쓰고 있습니다. 'XYZ :: A'는 당신이 호출하고있는 네임 스페이스가 다른 상수'XYZ'를 정의하지 않는 한 작동합니다. 'A'는 A가 정의 된 곳과 같은 네임 스페이스에 어휘 적으로있을 때만 작동합니다. Ruby 상수에 액세스하는 데 필요한 추가 학습 자료를 찾으십시오. 여기에 설명 할 충분한 공간이 없습니다. –

0

이 작동합니다 :

module XYZ 
    class A 
    end 
    class B < A 
    end 
end 

을 그 다음 XYZ 모듈을 포함하고 A로부터 C를 확장하는 :

module ABC 
include XYZ 
    class C < A 
    end 
end 
관련 문제