【发布时间】:2020-05-31 02:23:20
【问题描述】:
我正在用 Ruby 构建内存中的实例模型。有一堆类,每个类都由该类上的类方法实例化和管理。有很多这些类方法,例如列出所有实例、检索所有实例等。
这些方法的代码在所有类中都是通用的,不需要考虑这些类的任何特殊性。因此,我希望该代码存在于一个共同的地方。请参阅下面的list 方法。我的问题:如何最好地实现这一目标。
class A
attr_reader :value
@@instances = []
def initialize(value:)
@value = value; @@instances << self
end
def self.list
@@instances.each { |i| puts "#{i.value}"}
end
end
class B
attr_reader :value
@@instances = []
def initialize(value:)
@value = value; @@instances << self
end
def self.list
@@instances.each { |i| puts "#{i.value}"}
end
end
A.new(value: '100')
A.new(value: '101')
B.new(value: '200')
B.new(value: '201')
A.list
B.list
理想情况下,我只定义一次 list 方法。我也尝试过将其移至超类:
class Entity
def self.list
@@instances.each { |i| puts "AB: #{i.value}"}
end
end
class A < Entity
attr_reader :value
@@instances = []
def initialize(value:)
@value = value; @@instances << self
end
end
class B < Entity
attr_reader :value
@@instances = []
def initialize(value:)
@value = value; @@instances << self
end
end
...但正如人们所期望的那样,超类无法访问其子类的@@instances 数组。将 @@instances 数组移动到超类会导致数组对 所有 类通用,这不是我需要的。
【问题讨论】:
标签: ruby oop class-method