子类实例变量在Ruby中更改超类实例变量
在这两个职位中: 人们在写关于在所有OOP语言中,超类和派生类如何没有单独的对象,以及当您创建派生类的实例时,它也是超类的实例。有一个对象,它同时是两个类 问题是我不明白?一个对象如何同时是两个类?如果实例变量使用相同的名称,那么它们怎么可能是相同的呢 我的意思是子类从超类中获取方法,但我不知道它们如何共享这些实例变量 我已经阅读了至少四本Ruby书籍,我所发现的只是实例变量没有通过继承链共享子类实例变量在Ruby中更改超类实例变量,ruby,variables,inheritance,instance,Ruby,Variables,Inheritance,Instance,在这两个职位中: 人们在写关于在所有OOP语言中,超类和派生类如何没有单独的对象,以及当您创建派生类的实例时,它也是超类的实例。有一个对象,它同时是两个类 问题是我不明白?一个对象如何同时是两个类?如果实例变量使用相同的名称,那么它们怎么可能是相同的呢 我的意思是子类从超类中获取方法,但我不知道它们如何共享这些实例变量 我已经阅读了至少四本Ruby书籍,我所发现的只是实例变量没有通过继承链共享 有人能简要解释一下子类中的“实例变量”是如何以及为什么实际存储在超类中的吗?让我们考虑真实的事物,
有人能简要解释一下子类中的“实例变量”是如何以及为什么实际存储在超类中的吗?让我们考虑真实的事物,而不是类 假设你有宠物的概念,让我们假设所有有宠物的人都有一个名字。现在让我们假设你有了宠物狗的概念,就像所有宠物一样,它有一个名字,但也有一个“品种” 正如你所见,将宠物狗视为宠物(其超类)和宠物狗(宠物的子类)是完全合理的 从数学上来说,你可以把一个类看作是一组具有相似特征的所有对象,然后子类“包围”了这个超类,并具有更多的特征
class Food
attr_accessor :name
end
class Fruit < Food
attr_accessor :ripeness
end
banana = Fruit.new
banana.ripeness = 0 # very green banana
banana.name = "banana"
steak = Food.new
steak.ripeness = 3 # ERROR... the base class Food does not know about "ripeness"
类食品
属性存取器:名称
终止
水果类<食品类
属性存取器:成熟度
终止
香蕉=水果
香蕉成熟度=0#非常绿的香蕉
banana.name=“香蕉”
牛排=食物
牛排成熟度=3#错误。。。底层食物不知道“成熟度”
一个真实的(有效的)例子怎么样?让我们使用DSL定义时钟和报警UI组件
时钟组件类是React::component::Base的子类,因此获得了很多作为基类一部分的“状态”。它知道如何呈现为html,知道在事物更新时如何反应,等等。这都是基类的一部分,所有控制它并使其工作的数据都留在基类中
此外,时钟IH还具有一些特殊属性,即它在@Clock变量中跟踪当前时间。它也每秒钟更新一次
然后我们做了一个子类,叫做Alarm
因为闹钟是时钟的一个子类,所以它有一个内部@Clock变量(实际上是时钟类的一部分),和其他任何时钟一样,闹钟每秒都会更新自己这很重要请注意,初始化@Clock变量的是Clock类,使用时钟更新(重新显示)自身的也是Clock类。当Alarm从Clock继承时,@Clock变量必须保留为Clock的一部分,以使其正常工作
但除此之外,Alarm还使用@clock变量用于其自身目的,即检查并查看是否“times up”,当它启动时,它会很好地停止时钟运行(请注意,即使在显示警报后,时钟仍会继续运行,但闹钟不会
希望这有帮助-确保运行示例
类时钟params.at
参数通知
@停止
终止
终止
def渲染
“警报将在#{(时间参数。现在)。到#秒后发出”
终止
终止
元素['#容器']。渲染do
div do
#这是react.rb创建新时钟实例的方法
#它是制作时钟的简写。new()和其他一些东西
时钟()
溴
警报(
时间:现在+10.5秒,
通知:->{alert('beep-beep')}
)
终止
终止
让我们思考真实的事物,而不是类
假设你有宠物的概念,让我们假设所有宠物都有一个名字。现在让我们假设你有宠物狗的概念,就像所有宠物都有一个名字,但也有一个“品种”
正如你所见,将宠物狗视为宠物(其超类)和宠物狗(宠物的子类)是完全合理的
从数学上来说,你可以把一个类看作是一组具有相似特征的所有对象,然后子类“包围”了这个超类,并具有更多的特征
class Food
attr_accessor :name
end
class Fruit < Food
attr_accessor :ripeness
end
banana = Fruit.new
banana.ripeness = 0 # very green banana
banana.name = "banana"
steak = Food.new
steak.ripeness = 3 # ERROR... the base class Food does not know about "ripeness"
类食品
属性存取器:名称
终止
水果类<食品类
属性存取器:成熟度
终止
香蕉=水果
香蕉成熟度=0#非常绿的香蕉
banana.name=“香蕉”
牛排=食物
牛排成熟度=3#错误……基本食物不知道“成熟度”
一个真实(工作)的例子怎么样?让我们使用DSL来定义时钟和报警UI组件
Clock component类是React::component::Base的子类,因此获得了很多作为基类一部分的“状态”。它知道如何呈现为html,知道在事物更新时如何反应,等等。这些都是基类的一部分,所有控制并使其工作的数据都保留在基类中
此外,时钟还有一些特殊属性,即它在@Clock变量中跟踪当前时间。它还每秒更新自己
然后我们做了一个子类,叫做Alarm
因为闹钟是时钟的一个子类,所以它有一个内部@Clock变量(实际上是时钟类的一部分),和其他任何时钟一样,闹钟每秒都会更新自己。这很重要!请注意
baz = Bar.new
baz.class # => Bar
baz.class.ancestors # => [Bar, Foo, Object, Kernel, BasicObject]
baz.bar # => :bar
baz.foo # => :foo