Ruby - 类方法中的引用子类

标签 ruby class inheritance

不确定这在 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上,这将是 BarBaz当你执行 Bar.getBaz.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/

相关文章:

Ruby Imap OpenSSL::SSL::SSLError:读取服务器证书 B:证书验证失败

ruby - ruby 字符串中的 #{} 究竟做了什么?

c++ - 对类的 vector 进行排序

postgresql - 如何使用 BEFORE 触发器防止在 PostgreSQL 中的继承表上插入、更新和删除

ruby - 需要 ruby​​ 目录中所有文件的最佳方法?

ruby 线程输出

Java - 从另一个类的 ArrayList 中读取

python - 我什么时候应该写一个类而不是一组函数?

c# - 继承基类时,C#是否默认为new而不是override是有原因的吗?

inheritance - 覆盖上层类(Class)的变量