2013-06-18 82 views
2

比方說,我有一個類:紅寶石:創建一個不繼承類方法

class Person 
    def self.say 
    puts "hello" 
    end 
end 

而且一個子類:

class Woman < Person 
    end 

我想「說」的方法是公開的方法,但我不希望它被「女人」或任何其他子類繼承。什麼是實現這一目標的正確途徑?

  • 我不想重寫該方法,因爲我不知道未來的子類。
  • 我知道我可以使用類似remove_method,但我寧願在所有
+3

這是你在那裏做的一些奇怪的OOP。 –

+2

你想達到什麼目的? – Gerep

+0

我想在基類中有一個靜態方法,它根據我提供的參數找到一個子類@Gerep – benams

回答

1

我同意這是一個奇怪的規定,以不繼承方法。但是如果你堅持,你可以爲Person創建一個inherited鉤子並手動從子類中移除類方法。

class Person 
    def self.say 
    puts "Hello" 
    end 

    def self.inherited(subclass) 
    self.methods(false).each do |m| 
     subclass.instance_eval { eval("undef :#{m}") } 
    end 
    end 
end 

class Woman < Person 
end 

Person.say #=> Hello 
Woman.say #=> undefined method `say' for Woman:Class (NoMethodError) 
+1

這是我不想做的事情。 (民主/ remove_method)。我寧願不繼承它! – benams

+2

@benams你應該去找其他一些語言:-) –

3

我想在基類的一個靜態方法,即找到一個子類,根據我供應

定義一個靜態方法在其他地方,例如在模塊中的參數:

module Person 

    class Base 
    end 

    class Woman < Base 
    end 

    def self.create(name) 
    case name 
    when :woman 
     Woman.new 
    end 
    end 

end 

Person.create(:woman)   # => #<Person::Woman:0x007fe5040619e0> 
Person::Woman.create(:woman) # => undefined method `create' for Person::Woman:Class