【问题标题】:What is the proper way of inheritance in Ruby?Ruby中正确的继承方式是什么?
【发布时间】:2016-01-25 20:56:36
【问题描述】:

为什么说在 ruby​​ 中实例方法被子类继承而不是超类的实例变量? 从代码中可以清楚地看到 @order 是一个实例变量 ruby 被子类方法 Price_demand 继承

class Management

    def price
        @OrderNo=4
        @Order =4
        puts "the price of order #{@OrderNo.to_s} is $40"
    end
    def exe
        puts "print #{@Order.to_s}"
    end

    def rant
        puts "please hurry with the order"
    end 
end


class Waiter < Management


    def Price_demand
        puts "the price of #{@Order.to_s} is $5"
    end
end


a=Waiter.new
a.price 
a.exe
a.Price_demand
puts a.instance_variables

【问题讨论】:

  • ...instead of instance variable of the superclass - 你能引用任何文件来支持你的说法吗?
  • 它在第 84 页的“Head First Ruby”一书中有

标签: ruby


【解决方案1】:

没有子类或超类的实例变量。实例变量是 instances 的属性,而不是类。毕竟,这就是为什么它们被称为“实例”变量!

一旦您理解了这一点,您的代码应该会变得清晰:实例变量属于a。修改它的方法在哪里定义并不重要。

[注意:显然,类也是实例(属于Class类),因此它们可以拥有自己的实例变量,但这不是我们这里要讨论的。]

【讨论】:

  • 我对类中的 Ruby 中的变量声明有点困惑,我们不能在类中声明任何变量,例如类 Management holla="hi" end
  • 是的,当然,类体可以有局部变量。请注意,局部变量不属于对象,它们属于词法范围。
【解决方案2】:

实例变量在通过赋值初始化之前不会存在。无论该类是否被继承,都是如此。例如,对于父类Management,观察到以下情况

m = Management.new
p m.instance_variables
#=> []
m.price
p m.instance_variables
#=> [:@OrderNo, :@Order]

将其与继承联系起来似乎令人困惑,我想说“Head First Ruby”一书的作者不必要地混淆了本书该部分的读者。


如果您在 Management 类中有一个将实例变量初始化为用户提供的或默认值的构造函数,那么您会看到这些实例变量在 instance_variables 方法的响应中列出。

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 2011-03-13
    • 2016-11-21
    • 2023-04-09
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多