这里实际上有两种情况:1)对象属于同一类型(例如,所有对象都是SomeClass对象),2)对象的类型不同。
我最感兴趣的是案例1.我试图用类变量来实现它,但我在互联网上阅读从不使用类变量(我同意部分)。还有哪些方法可以实现相同的功能?
答案 0 :(得分:1)
为了让类中的所有对象共享数据,您可以使用类变量或类实例变量。
类变量在类层次结构中共享。这可能会产生可能会破坏您期望的副作用,如本示例所示:
class A
@@common_data = :x
def common_computation
@@common_data
end
end
class B < A
@@common_data = :y
end
A.new.common_computation
# => y
B.new.common_computation
# => y
类实例变量避免了这个问题。
class A
class << self
attr_accessor :common_data
end
def common_computation
self.class.common_data
end
self.common_data = :x
end
class B < A
self.common_data = :y
end
A.new.common_computation
# => x
B.new.common_computation
# => y
您可以使用模块和mixin来共享功能和数据。
module CommonFunctionality
attr_writer :common_data
def common_computation
# use @common_data
end
end
class A
include CommonFunctionality
end
class B
include CommonFunctionality
end
a = A.new
a.common_data = :x
a.common_computation
a.is_a? B # => false
a.kind_of? CommonFunctionality # => true
b = B.new
b.common_data = :y
b.common_computation
b.is_a? A # => false
b.kind_of? CommonFunctionality # => true