子类中的ruby restrict attr_访问器

子类中的ruby restrict attr_访问器,ruby,inheritance,attr-accessor,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 < Pare

我想在子类中限制超类方法的访问

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
在这里我得到了儿子的全名哈里·史密斯,但我想要哈里·奇普利

我应该这样做


应该这样做。

您可以重新定义姓氏设置器:

Class Son < Parent

...

def last_name=(name)
end

您可以重新定义姓氏设置器:

Class Son < Parent

...

def last_name=(name)
end

在父级的initialize方法中:

@first_name, @last_name = [first_name, last_name]
试试这个

以及:


这样,它只会在儿子没有从parent good for Olivers设置名字的情况下定义姓氏

在父级的初始化方法中:

@first_name, @last_name = [first_name, last_name]
试试这个

以及:


这样,它只会在儿子没有从parent good for Olivers设置名字的情况下定义姓氏

我现在能想到的一个解决方案是重新定义last_name=方法,例如,它不做任何事情或抛出异常。这种行为也可以包装在一个mixinOne解决方案中,我现在能想到的就是重新定义last_name=method,这样它就什么也不做,或者抛出一个异常。此行为也可以包装在mixinthanks中,但当我在Son的initialize方法@last_name=parent.last_name中访问父对象的lasat_name时会出现错误。从Son的实例访问父对象的last_name的最佳方式是什么?,比如attr_reader:son中的姓氏会给出父母的姓氏。我认为对于这个问题,最好不要使用继承。如果儿子进入证人保护计划并获得新的姓氏,会发生什么情况?我实际需要的是,如果尝试运行son.last_name='something',则会出现一个错误“姓氏必须取自家长”。儿子可以得到姓,但姓总是和父母一样。因为last_name应该是他的父名,而不是son自己设置的任何名称。谢谢,但是当我在son的initialize方法@last_name=parent.last_name中访问父名lasat_name时会出现错误。从son的实例访问父名lasat_name的最佳方法是什么?,比如attr_reader:son中的姓氏会给出父母的姓氏。我认为对于这个问题,最好不要使用继承。如果儿子进入证人保护计划并获得新的姓氏,会发生什么情况?我实际需要的是,如果尝试运行son.last_name='something',则会出现一个错误“姓氏必须取自家长”。儿子可以得到姓,但姓总是和父母一样。因为姓氏应该是他父母的名字,而不是儿子自己设定的名字,所以我仍然可以将姓氏设置为child。我需要的是,如果尝试运行son.last_name='something',则会出现一个错误“last name必须取自父级”。Son可以获取last_name,但last_name始终与Parents相同然后:def last_name=name raise last name必须取自parent End我仍然可以将last_name设置为child。我需要的是,如果尝试运行son.last_name='something',则会出现一个错误“last name必须取自父级”。Son可以获取last_name,但last_name始终与parentthen相同:def last_name=name必须从父端获取last name