Ruby 继承但不与超类共享且不共享命名空间的变量/常量
有并没有办法引入具有以下三个属性的变量/常量 a) 当超类未在自己的类中赋值时,它继承超类的值 b) 它不会继承超类以外的其他类的值(即使它们共享名称空间) c) 当在自己的类中赋值时,它不会覆盖超类的值 使用类实例变量时,a)不满足要求Ruby 继承但不与超类共享且不共享命名空间的变量/常量,ruby,variables,constants,Ruby,Variables,Constants,有并没有办法引入具有以下三个属性的变量/常量 a) 当超类未在自己的类中赋值时,它继承超类的值 b) 它不会继承超类以外的其他类的值(即使它们共享名称空间) c) 当在自己的类中赋值时,它不会覆盖超类的值 使用类实例变量时,a)不满足要求 class A; @foo = :foo end class B < A; @foo end # => nil (Does not satisfy (a)) class A; class C; @foo end end # => nil (
class A; @foo = :foo end
class B < A; @foo end # => nil (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))
class B < A; @foo = :bar end
class A; @foo end # => :foo (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))
class B < A; @@foo = :bar end
class A; @foo end # => :bar (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))
class B < A; Foo = :bar end
class A; Foo end # => :foo (Satisfies (c))
A类@foo=:foo结束
B级nil(不满足(a))
甲级;丙级;@foo end#=>nil(满足(b))
B级:foo(满足(c))
使用类变量,c)是不满足的
class A; @foo = :foo end
class B < A; @foo end # => nil (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))
class B < A; @foo = :bar end
class A; @foo end # => :foo (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))
class B < A; @@foo = :bar end
class A; @foo end # => :bar (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))
class B < A; Foo = :bar end
class A; Foo end # => :foo (Satisfies (c))
A类@@foo=:foo结束
B级:foo(满足(a))
甲级;丙级;@foo end#=>名称错误(满足(b))
B级:条(不满足(c))
使用常数b)不满足要求
class A; @foo = :foo end
class B < A; @foo end # => nil (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))
class B < A; @foo = :bar end
class A; @foo end # => :foo (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))
class B < A; @@foo = :bar end
class A; @foo end # => :bar (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))
class B < A; Foo = :bar end
class A; Foo end # => :foo (Satisfies (c))
A类;Foo=:Foo结束
B级:Foo(满足(a))
甲级;丙级;;Foo end#=>:Foo(不满足(b))
B级:Foo(满足(c))
我想要这样的东西:
class A; something = :foo end
class B < A; something end # => :foo (Satisfies (a))
class A; class C; something end end # => nil or Error (Satisfies (b))
class B < A; something = :bar end
class A; something end # => :foo (Satisfies (c))
A类;something=:foo end
B级零或错误(满足(b))
B级
如果不能简单地通过赋值和引用变量/常量来实现,那么有没有办法实现具有此属性的访问器方法?您需要创建自己类型的具有所需特定属性的访问器。比如说,
module InheritableProperty
def property
@property || superclass.property
end
def property=(value)
@property = value
end
end
class A
extend InheritableProperty
end
class B < A
extend InheritableProperty
class C
extend InheritableProperty
end
end
A.property = 1
A.property # => 1
B.property # => 1
B::C.property # error
A.property = 1
B.property = 2
A.property # => 1
B.property # => 2
B::C.property # error
A.property = 1
B.property = 2
B::C.property = 3
A.property # => 1
B.property # => 2
B::C.property # => 3
模块可继承属性
def属性
@属性| |超类.property
结束
def属性=(值)
@属性=值
结束
结束
甲级
扩展可继承属性
结束
B类1
B.属性#=>1
B::C.属性#错误
A.property=1
B.属性=2
A.属性#=>1
B.属性#=>2
B::C.属性#错误
A.property=1
B.属性=2
B::C.property=3
A.属性#=>1
B.属性#=>2
B::C.属性#=>3
按照约书亚·那不勒斯的建议,我决定这样做:
class A
def self.foo; defined?(@foo) ? @foo : superclass.foo end
end
class A; @foo = :foo end
class B < A; foo end # => :foo
class A; class C; foo end end # => Error
class B < A; @foo = :bar end
class A; foo end # => :foo
A类
def self.foo;定义?(@foo)@foo:superclass.foo结束
结束
甲级@foo=:foo结束
B级:foo
甲级;丙级;;foo end#=>错误
B级:foo