Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子类实例变量在Ruby中更改超类实例变量_Ruby_Variables_Inheritance_Instance - Fatal编程技术网

子类实例变量在Ruby中更改超类实例变量

子类实例变量在Ruby中更改超类实例变量,ruby,variables,inheritance,instance,Ruby,Variables,Inheritance,Instance,在这两个职位中: 人们在写关于在所有OOP语言中,超类和派生类如何没有单独的对象,以及当您创建派生类的实例时,它也是超类的实例。有一个对象,它同时是两个类 问题是我不明白?一个对象如何同时是两个类?如果实例变量使用相同的名称,那么它们怎么可能是相同的呢 我的意思是子类从超类中获取方法,但我不知道它们如何共享这些实例变量 我已经阅读了至少四本Ruby书籍,我所发现的只是实例变量没有通过继承链共享 有人能简要解释一下子类中的“实例变量”是如何以及为什么实际存储在超类中的吗?让我们考虑真实的事物,

在这两个职位中:

  • 人们在写关于在所有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