gee*_*zyx 3 ruby inheritance class
不确定这对于 Ruby 是否可行,但我正在尝试编写一个包含多个方法的类,这些方法将由多个子类共享。这个超类将包含我希望子类继承的类和实例方法。假设我永远不会直接使用超类,我只是用它来抽象出重复的方法(认为是 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
Run Code Online (Sandbox Code Playgroud)
我想要的行为是这样的:
Bar.get
puts Bar.param # => Woot
Baz.get
puts baz.param # => Pew Pew
Run Code Online (Sandbox Code Playgroud)
这可能吗?我是否以完全错误的方式处理这个问题?
更新
根据@Nathan,self.new在该self.get方法中做到了这里的技巧。
[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"
Run Code Online (Sandbox Code Playgroud)
使用self。
里面Foo.get,self是您要调用的类get,当您执行和时,它将分别是Bar和。BazBar.getBaz.get
因此,只要<SubClass>放置self,一切就会按您的预期进行。
def self.get
self.new(self::MY_CONSTANT)
end
Run Code Online (Sandbox Code Playgroud)
您也可以省略,self因为这是 Ruby 在未指定显式对象时自动使用的内容。
def self.get
new(self::MY_CONSTANT)
end
Run Code Online (Sandbox Code Playgroud)
另外,在您测试值的代码中,我认为您的意图是:
bar = Bar.get
puts bar.param # => Woot
baz = Baz.get
puts baz.param # => Pew Pew
Run Code Online (Sandbox Code Playgroud)
最后,至于这是否是最好的方法,这是基于意见的,但对我来说,你试图将值传递到initialize已经可以作为常量使用的情况下,这似乎很奇怪。换句话说,如果您有一个方法需要使用 API URI,只需直接引用常量,而不用使用@param. 您可以在实例方法中引用常量,如下所示:self.class::MY_CONSTANT
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |