【问题标题】:Nested classes in different files with inheritance具有继承性的不同文件中的嵌套类
【发布时间】:2017-07-07 11:43:38
【问题描述】:

所以我制作了一个程序,其中一个类包含多个类,但我认为将其拆分为多个程序会更有条理,每个子类一个程序。这会是组织代码的更好方法吗?这会影响性能吗?

我将如何将此代码拆分为两个文件?主程序将具有 Texty 类,我需要以某种方式从另一个文件中包含 String 类,但是您不能在 Ruby 中包含类,那么如何在保持从 Texty 继承的同时做到这一点?以及如何从另一个文件访问实例变量@inst_var

class Texty
  def initialize
    @inst_var = 0
  end
  def texty_method
    puts 'Bar'
  end
  class String < Texty
    def output(string)
      puts string
    end
  end
end

Texty::String.new.output('Foo')

【问题讨论】:

  • 这样的嵌套类不会在 Texty 和 String 之间创建任何类型的关系。您可以将 String 类(我会为此选择另一个名称)拉到它自己的文件中,在它声明之前需要 Texty 并保持您现在得到的相同结果。
  • 嗯...不太一样,因为您将在 Texty 命名空间之外引用 String,但我认为您明白了。
  • 我还能以这种方式访问​​ Texty 中的实例变量吗? (来自字符串)

标签: ruby class inheritance inner-classes instance-variables


【解决方案1】:

将您的代码拆分为多个文件和对象会降低性能,但影响很小,您甚至都不会注意到。

如果您按类拆分程序,我的建议是使用 rails 命名约定。

TestClass -> test_class.rb

然后在主程序的顶部执行:require_relative 'test_class.rb'

【讨论】:

    【解决方案2】:

    尝试像这样拆分文件,看看会发生什么。

    texty/texty.rb:

    class Texty
      def initialize(x)
        @x = x
      end
    end
    

    texty/string.rb:

    require_relative 'texty.rb'
    
    class Texty
      class String < Texty
        def test
          puts @x
        end
      end
    end
    

    然后从命令行运行:

    $ ruby -r ./texty/string.rb -e "Texty::String.new(1).test"
    

    它应该打印1,表明你的Texty::String类继承了@x ivar的初始化从它的父类Texty

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多