0

这是代码:

module A
  class C1
    def self.grovel(x)
      return A::helper(x) + 3
    end
  end

  class C2
    def self.grovel(x)
      return A::helper(x) + 12
    end
  end
  private
  def helper(y)
    y + 7
  end
  module_function :helper
end

f = A::C1.grovel(7)
puts f
puts A::C2.grovel(25)

我正在使用遗留代码,试图避免改变太多。我不确定我是否会使用相同的方法创建两个单独的类,因为每个类只包含一个方法,并且具有通用代码。我想将公共代码提取到只有 A 中的方法可以看到的方法中,但仍然必须使用其完全限定名称(“A::helper”)调用它。

有没有更好的方法来做到这一点?理想情况下,我想将公共代码包装在一个方法中(我们仍然称其为“帮助程序”),该方法可以在没有任何限定的情况下从类 grovel 方法中调用,但不容易用于模块 A 之外的代码。

谢谢。

4

2 回答 2

1

创建另一个模块怎么样?

module A
  module Helper
    def helper(y)
      y + 7
    end
  end  

  class C1
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 3
      end
    end
  end

  class C2
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 12
      end
    end
  end


end

puts A::C1.grovel(7)
puts A::C2.grovel(25)

您创建 A 的子模块,并将其作为 Mixin 包含在您的类中。这样,只有这些类可以访问该方法。

你可以看到它在http://rubyfiddle.com/riddles/31313

于 2014-01-17T07:26:37.557 回答
0

Minixs 很有用,当无法应用正确的继承时,例如,一个类必须继承其他两个类的属性,因此您可以在这里使用继承机制:

module A
  class C
    def self.helper(y)
      y + 7
    end
  end

  class C1 < C
    def self.grovel(x)
      return self.helper(x) + 3
    end
  end

  class C2 < C
    def self.grovel(x)
      return self.helper(x) + 12
    end
  end
end

puts A::C1.grovel(7)
puts A::C2.grovel(25)
于 2014-01-17T08:12:37.547 回答