2015-02-12 31 views
1

我想通过模块给一个类提供一个受保护的方法,只能由它自己和其他继承它们的类来调用。我想隐藏该方法被Class.method使用,并且只能由Class类内部或继承Class的子类访问。我会如何去做这件事?这是我迄今为止所拥有的。从模块定义受保护的类方法 - ruby​​

#! /usr/bin/env ruby 
module ProtectedClassMethods 
    @class_instance_var = 1234567 

    def included(base); base.extend(ProtectedClassMethods); end 

    protected 

    def protected_class_method; puts "A PROTECTED CLASS METHOD => #{@class_instance_var}"; end 
end 

class Class1 
    def value; "Class1"; end 
end 

class Class2 < Class1 
    extend ProtectedClassMethods 
    class << self 
    protected_class_method #crashes here 
    end 
    def value; "Class2"; end 

end 

class Class3 < Class2 
    class << self 
    @class_instance_var = 24681012 
    protected_class_method 
    end 
    def value; "Class3"; end 
end 



puts "Initializing Class1" 
class1 = Class1.new 
puts "Done (Class1)" 

puts "Initializing Class2" 
class2 = Class2.new 
puts "Done (Class2)" 

puts "Initializing Class3" 
class3 = Class3.new 
puts "Done (Class3)" 

puts class1.value 
puts class2.value 
puts class3.value 

给出了这样的错误

./protected_class_test.rb:20:in `singletonclass': undefined local variable or method `protected_class_method' for #<Class:Class2> (NameError) 
     from ./protected_class_test.rb:18:in `<class:Class2>' 
     from ./protected_class_test.rb:16:in `<main>' 
+0

你的问题是什么? – sawa 2015-02-12 05:22:16

回答

1

这里是工作的事情。

module ProtectedClassMethods 
    @class_instance_var = 1234567 

    def included(base); base.extend(ProtectedClassMethods); end 

    protected 

    def protected_class_method; puts "A PROTECTED CLASS METHOD => #{@class_instance_var}"; end 
end 

class Class1 
    def value; "Class1"; end 
end 

class Class2 < Class1 
    extend ProtectedClassMethods 
    protected_class_method #crashes here 
    def value; "Class2"; end 

end 

class Class3 < Class2 
    @class_instance_var = 24681012 
    protected_class_method 
    def value; "Class3"; end 
end 



puts "Initializing Class1" 
class1 = Class1.new 
puts "Done (Class1)" 

class << self 
    protected_class_method #crashes here 
end 

你实际上是呼吁元类(类类)和方法方法的类本身定义的。