不确定这在 Ruby 中是否可行,但我正在尝试编写一个包含多个方法的类,这些方法将由多个子类共享。这个父类(super class)将包含我希望子类继承的类和实例方法。假设我永远不会直接使用父类(super class),我只是用它来抽象出重复的方法(想想 DRY)。这涉及拥有会随着子类的变化而变化的常量(API URI)。
这是我正在尝试做的一个例子:
class Foo
attr_accessor :param
def initialize(param)
@param = param
end
def self.get
<SubClass>.new(self::MY_CONSTANT)
end
end
class Bar < Foo
MY_CONSTANT = 'Woot'
end
class Baz < Foo
MY_CONSTANT = 'Pew Pew'
end
我想要的行为是这样的:
Bar.get
puts Bar.param # => Woot
Baz.get
puts baz.param # => Pew Pew
这可能吗?我是不是以完全错误的方式来处理这个问题?
更新
Per @Nathan,self.get
方法中的 self.new
在这里起到了作用。
[39] pry(main)> test = Bar.get
=> #<Bar:0x000001072ecc20 @param="Woot">
[40] pry(main)> test.param
=> "Woot"
[41] pry(main)> test
=> #<Bar:0x000001072ecc20 @param="Woot">
[42] pry(main)> test.class
=> Bar
[43] pry(main)> test2 = Baz.get
=> #<Baz:0x000001071b5528 @param="Pew Pew">
[44] pry(main)> test2.class
=> Baz
[45] pry(main)> test2.param
=> "Pew Pew"
最佳答案
使用 self
.
内部Foo.get
, self
是你打电话的类(class)get
上,这将是 Bar
和 Baz
当你执行 Bar.get
和 Baz.get
, 分别。
因此,你有<SubClass>
, 只需输入 self
,一切都会如您所愿。
def self.get
self.new(self::MY_CONSTANT)
end
你也可以省略self
因为当没有指定显式对象时,Ruby 会自动使用它。
def self.get
new(self::MY_CONSTANT)
end
此外,在您测试值的代码中,我认为您的意图是:
bar = Bar.get
puts bar.param # => Woot
baz = Baz.get
puts baz.param # => Pew Pew
最后,关于这是否是最佳方式,这是基于意见的,但我觉得您试图将值传递给 initialize
似乎很奇怪当它已经作为常量可用时。换句话说,如果您有一个需要使用 API URI 的方法,只需直接引用常量即可,而不是使用 @param
初始化实例本身。 .您可以像这样在实例方法中引用常量:self.class::MY_CONSTANT
关于Ruby - 类方法中的引用子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357582/