【发布时间】:2015-10-26 23:49:14
【问题描述】:
不确定 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
我想要的行为是这样的:
Bar.get
puts Bar.param # => Woot
Baz.get
puts baz.param # => Pew Pew
这可能吗?我是不是完全错误地处理了这个问题?
更新
根据@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"
【问题讨论】:
-
您可能会发现对代码
puts语句进行加盐会很有帮助,这些语句会为您提供self的值。例如,class Klass; def my_method; puts "self in #{__method__} = #{self}"; end; end; Klass.new.my_method #=> self in my_method = #<Klass:0x007fbd4987fdd0>。
标签: ruby class inheritance