gpt4 book ai didi

ruby - 访问父类实例变量

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:57 24 4
gpt4 key购买 nike

这是如何工作的?

class A
attr_accessor :name

def initialize params
@name = params[:name]
@collection << B.new
end
end

class B < A
def initialize
@my_name = lookup_something(<parent.name>)
end
end

基本上,我需要父类中的一个值用于子类的查找,但如果有更好的方法,我不想显式传递它。父类的实例变量在子类中是否完全不可访问?或者这只是糟糕的层次结构设计?

最佳答案

我真的不知道您要在这里做什么 - 您发布的所有代码都适用于实例 变量。实例变量是针对每个对象的,而不是针对每个类的,所以当您说“我需要父类的值”时,我不知道您的意思。

我在您的代码中注意到了几件事:

  • 基类应该永远知道子类。所以在A#initialize中创建B对象并不是一件好事,因为基类使用了子类。
  • 您正在用与 A#initialize 完全不同的行为覆盖类 B#initialize您甚至可以更改参数列表。这也不是一件好事。 子类的对象的行为方式应与其父类(super class)的对象相同。
  • 当您调用 B.new('myname') 时,变量 @name 永远不会被赋值,因为 A#initialize 方法是从来没有打电话。您必须调用 super(:name => name)(运行父类(super class) initialize)或者您必须分配给 @name直接在B#initialize
  • 一旦定义了@name,您所有的实例方法都可以使用它的值。包括在父类/父类(super class)中定义的那些。

让我说我不太清楚你为什么在这里使用继承,我觉得这不是你想要的。如果您有两个类用于两个不同的事物,那么应该永远涉及继承。如果您想重用代码,请查看 Ruby 的混合功能,或者将您的复杂对象组合成几个具有您想要重用的行为的“较小”对象。

关于ruby - 访问父类实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com