我目前正在尝试实现与这个问题的选择答案中提出的类似的东西:Ruby design pattern: How to make an extensible factory class?
class LogFileReader
@@subclasses = { }
def self.create type
c = @@subclasses[type]
if c
c.new
else
raise "Bad log file type: #{type}"
end
end
def self.register_reader name
@@subclasses[name] = self
end
end
class GitLogFileReader < LogFileReader
def display
puts "I'm a git log file reader!"
end
register_reader :git
end
class BzrLogFileReader < LogFileReader
def display
puts "A bzr log file reader..."
end
register_reader :bzr
end
LogFileReader.create(:git).display
LogFileReader.create(:bzr).display
class SvnLogFileReader < LogFileReader
def display
puts "Subersion reader, at your service."
end
register_reader :svn
end
LogFileReader.create(:svn).display单元测试运行得无懈可击,但是当我启动服务器时,没有注册任何类。关于静态方法调用是如何工作的,我可能遗漏了什么?每个子类什么时候进行register_reader调用?
发布于 2018-08-29 03:35:06
为了回答OP关于类何时调用register_reader的问题,它发生在文件加载的时候。将此代码添加到初始化器中,以便自己加载文件。
Dir[Rails.root.join('path', 'to', 'log_file_readers', '**', '*.rb').to_s].each { |log_file_reader| require log_file_reader }
https://stackoverflow.com/questions/21010515
复制相似问题