ruby限制子类中的attr_accessor

时间:2012-11-03 09:29:11

标签: ruby inheritance attr-accessor

我想限制超类的方法在子类

中的访问
class Parent
  attr_accessor :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name, @last_name = first_name, last_name
  end

  def full_name
  @first_name + " " + @last_name 
  end

end

class Son < Parent
  attr_accessor :first_name

  def initialize(parent, first_name)
    @first_name = first_name 
    @last_name = parent.last_name
  end

  def full_name
    @first_name + "  " + @last_name 
  end
end


p = Parent.new("Bharat", "Chipli")
puts p.full_name

s = Son.new(p, "Harry")
s.last_name= "Smith"
puts s.full_name

这里我得到儿子的全名“Harry Smith”,但我想“Harry Chipli”

3 个答案:

答案 0 :(得分:4)

在父级的初始化方法中:

@first_name, @last_name = [first_name, last_name]

试试这个

class Son
  def attr_reader :last_name

  def last_name=(name)
    @last_name ||= name
  end
end
这样,如果儿子没有从父母那里设置名字(适合孤儿),它只会定义姓氏。

答案 1 :(得分:0)

class Son < Parent
  attr_accessor :first_name

  ...

  private

  attr_accessor :last_name
end

应该这样做。

答案 2 :(得分:0)

您可以重新定义last_name setter:

Class Son < Parent

...

def last_name=(name)
end