类和继承

时间:2015-07-09 12:03:54

标签: ruby oop inheritance

我正在尝试理解Ruby中的继承系统。这是我的代码:

class Man
  attr_accessor :name

  def initialize(name = "Foo")
    @name = name
  end
end

class User < Man
  attr_accessor :mail

  def initialize(mail = "bar")
    super
    @mail = mail
  end
end

这是我的考验:

man = Man.new
man
=> #<Man:0x007fb68da4a768 @name="Foo">

user = User.new
user
=> #<User:0x007fb68da442c8 @name="bar", @mail="bar">

我不明白为什么用户的@name不是“Foo”! Normaly,它应该是因为它是man初始化方法中的默认参数,不是吗?

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

super(没有参数列表)使用传入的相同参数调用超类中的相同方法。如果要显式传递 no 参数,你必须使用空参数列表:super()

请记住:super不是方法调用,它是关键字,关键字不必遵循常规方法调用评估规则。这是其中一个差异。对于方法调用,foofoo()是等效的,它们都不传递任何参数。对于super的区别:super()不传递参数,super 转发参数。

现在,这是一个额外的转折:实际上,你将任何参数传递给initialize,那么它们如何被传递......或者你呢?好吧,事实证明,为了调用super,可选参数的默认参数被视为已经显式传递。

答案 1 :(得分:2)

不带参数的

super是传递传递给当前正在执行的方法的相同参数的快捷方式。在你的例子中,&#34; bar&#34;被隐含地传递给了超级班(这就是为什么你得到的&#34; bar&#34;对于他们两者而言)。

避免混淆的可选解决方案:

class User < Man
  attr_accessor :mail

  def initialize(name = "foo", mail = "bar")
    super(name)
    @mail = mail
  end
end

答案 2 :(得分:0)

使用一个参数调用User类,并在初始化内部调用具有相同参数bcs的父类。你像这样使用super

如果你致电super()你不发送参数bcs,你可以调用父初始方法,没有参数。

像这样

class Man
  attr_accessor :name

  def initialize(name = "Foo")
    @name = name
  end
end

class User < Man
  attr_accessor :mail

  def initialize(mail = "bar")
    super()
    @mail = mail
  end
end

Man.new
# => #<Man:0x52a7e380 @name="Foo">
User.new
# => #<User:0x11777eb0 @mail="bar", @name="Foo">

答案 3 :(得分:0)

试试这个,它会对你有用:

class Man
  attr_accessor :name

  def initialize(name = "Foo")
    @name = name
  end
end

class User < Man
  attr_accessor :mail

  def initialize(mail = "bar")
    super()
    @mail = mail
  end
end

man = Man.new
puts man.name  #> Foo
user = User.new
puts user.name  #> Foo

答案 4 :(得分:0)

super without arguments,用它自己调用的相同参数调用超类的初始值设定项。你可以看到,因为name与mail有相同的价值。

您想要做的是:

ButtonMenuHighlightText

通过使用括号,可以使用其他初始值设定项的默认值。