使继承的函数动态

时间:2016-10-30 15:22:46

标签: ruby inheritance

我有一个具有以下架构的Ruby项目:
Project architecture

我的所有子控制器(city1,city2)都从项目根目录的父控制器继承。我在父控制器中有一个方法:

class Controller
  def get_directories
    Dir.chdir(File.dirname(__FILE__) + "/")
    Dir.glob('*').select { |f| File.directory? f }
  end
end

我的孩子控制员:

require_relative '../controller'

class City1Controller < Controller
end

require_relative '../controller'

class City2Controller < Controller
end

根据我的理解,此方法查看当前的工作目录并返回该目录中的文件夹数组。

我希望子控制器以这样的方式继承这个函数,其中get_directories将是子目录的本地,但是它显示了父目录中的文件夹。

这就是发生的事情:

controller.get_directories => city1 city2  
city1_controller.get_directories => city1 city2  
city2_controller.get_directories => city1 city2  

这就是我想要发生的事情:

controller.get_directories => city1 city2  
city1_controller.get_directories => monument1 monument2  
city2_controller.get_directories => monument3 monument4 

如果我在每个子控制器中重复完全相同的方法(从而覆盖父定义),它就会按照我想要的方式工作。但这不是继承应该饶恕我们的吗?

方法本身的问题,继承如何工作或我如何使用它?

1 个答案:

答案 0 :(得分:1)

正如塞尔吉奥已经指出的那样:__FILE__不是一种方法。它是对当前文件名称的引用,它返回一个相对路径,指向它所在的文件。

一个选项可能是将__FILE__传递给方法,如下所示:

class Controller
  def get_directories(file = __FILE__)
    Dir.chdir(File.dirname(file) + "/")
    Dir.glob('*').select { |f| File.directory? f }
  end
end

儿童控制器:

require_relative '../controller'

class City1Controller < Controller
  def get_directories
    super(__FILE__)
  end
end

require_relative '../controller'

class City2Controller < Controller
  def get_directories
    super(__FILE__)
  end
end