在Ruby中扩展类的最佳实践是什么?

时间:2013-04-26 10:24:44

标签: ruby inheritance

我想了解以下

之间的区别
module XYZ
  class A
  end
  class B
  end
end

C类是否继承了A类和B类,或者我必须使用< ?

module YZZ
include XYZ
  class C < A
  end
end

当我关注时会发生什么?它现在包括所有类,还是只包含A类?

module YZZ
extend XYZ
  class C < A
  end
end
  • 从A扩展C类的最佳方法是什么?
  • 如何使用A和B扩展C类?
  • 我怎样才能只包括A类?

2 个答案:

答案 0 :(得分:0)

这应该有效:

module XYZ
  class A
  end
  class B < A
  end
end

然后包括XYZ模块并从A扩展C:

module ABC
include XYZ
  class C < A
  end
end

答案 1 :(得分:0)

广告1.是的,当您使用#include时,C会继承A和B. #extend适用于类方法。

Ad 2. class C < A,想一想A只是一个常数,它被分配了一个对象 实例Class作为值。所以,当然,C成为它的子类。

广告3.当您在'module'语句中使用#extend时,self是模块本身,而XYZ 基本上被包含在它的sigleton类中。

至于你最后的三个项目符号问题,我不明白第一个问题。什么是“从A扩展C类”? class C < XYZ::A会这样做吗?至于第二个项目符号问题,您可以简单地通过C.extend( XYZ )扩展C“同时使用A和B”。至于“你怎么能只包括A类”,没有简单的方法只包括模块的一部分。如果您打算单独包含A类,如果它有自己的关注,即使没有B也要解决,请将其放在一个单独的模块中并包含该模块。这称为关注点分离。如果你只想挑选,你可以这样做:

module Something
  A = XYZ::A
end

你有一个常量Something :: A指向与XYZ :: A相同的类。