Ruby中正确的继承方式是什么?

时间:2016-01-25 11:49:23

标签: ruby

为什么说在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

2 个答案:

答案 0 :(得分:1)

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

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

将这与继承相关似乎令人困惑,我想说“Head First Ruby”一书的作者在本书的那一部分中不必要地混淆了读者。

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

答案 1 :(得分:1)

子类或超类没有实例变量。实例变量是实例的属性,而不是类。这就是为什么他们被称为&#34;实例&#34;毕竟是变量!

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

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