2014-04-22 1 views
2

모듈/클래스 Afoo 메서드를 정의하여 모듈/클래스 B 또는 하위 클래스에서만 볼 수 있도록 할 수 있습니까? 다음은이 상황을 보여줍니다.특정 모듈/클래스 내에서만 볼 수있는 메서드 정의

A.new.foo # => undefined 

class B 
    A.new.foo # => defined 
    def bar 
    A.new.foo # => defined 
    end 
    def self.baz 
    A.new.foo # => defined 
    end 
end 

class C < B 
    A.new.foo # => defined 
    def bar 
    A.new.foo # => defined 
    end 
    def self.baz 
    A.new.foo # => defined 
    end 
end 

세련된 느낌이 직감적으로 느껴지지만 원하는대로하지 않는 것 같습니다.

+0

상세 검색의 문제점은 무엇입니까? 내가 아는 한, 당신은 B 내에서 세련미를 사용할 수 있어야하고 당신이 묘사하는 것과 정확히 일치 할 수 있어야합니다. – samuil

+0

상세 검색을 사용하면'B'의 클래스 본문에 매번'using ... '이라고 써야합니다. 그것은 비실용적입니다. – sawa

답변

-1

이것은 작동합니다.^_^

class A 
    private 
    def foo 
     "THE FOO !!!" 
    end 
end 

class B < A 
    public :foo 

    def initialize 
     @foo = self.foo 
    end 
end 

puts "A.new.foo #{ A.new.foo rescue '... sorry, no.' }" 
=> A.new.foo ... sorry, no. 

puts "B.new.foo #{ B.new.foo rescue '... sorry, no.' }" 
=> B.new.foo THE FOO !!! 

당신은 여전히 ​​당신이 다음을 사용해야하는 클래스 이름을 사용하여 모든 하위 클래스 내에서 A.new.foo를 사용하려면

.

class A 
    private 
    def foo 
     "THE FOO !!!" 
    end 
end 

class B 
    class A < A 
     public :foo 
    end 

    attr_reader :c, :d 

    def c 
     A.new.foo 
    end 

    def d 
     A.new.foo 
    end 
end 

puts "A.new.foo #{ A.new.foo rescue '... sorry, no.' }" 
=> A.new.foo ... sorry, no. 

puts B.new.c 
=> THE FOO !!! 

puts B.new.d 
=> THE FOO !!!