【发布时间】:2013-04-23 14:45:07
【问题描述】:
我知道这可能是一个很长的机会,但我想我会问:
由于 Ruby 不执行父类的 initialize 方法,除非您在继承类的 initialize 方法中显式调用 super(或者除非您不在继承类中重载它),我想知道如果在实例化继承类的新实例时有其他方法可以将代码作为父上下文的一部分(可能是钩子)执行......
在实现B的初始化方法时,目前的行为是这样的:
class A
def initialize
puts "Inside A's constructor"
end
end
class B < A
def initialize
puts "Inside B's constructor"
end
end
A.new
B.new
# Output
# => Inside A's constructor
# => Inside B's constructor
我想知道输出是否可能是:
A.new
# => Inside A's constructor
B.new
# => Inside A's constructor
# => Inside B's constructor
【问题讨论】:
-
这不是特定于
initialize。它对所有方法都是通用的。如果一个方法总是隐式调用超方法,那么,您将无法覆盖子类的方法定义。那会很不方便。 -
您要求
A中的代码强制在B中发生某些事情,不幸的是,语言结构对您不利。但是,根据上下文,您可能有选择。我认为这是出于某种目的,例如简化框架中的子类化?例如,许多框架提供了生成属性的替代方法,例如,不需要子类中的构造函数,并且基类构造函数可以在没有尴尬的指令框架用户“确保调用 super”的情况下运行。 -
我想强制执行某些继承规则。例如:我不希望类直接从其他类继承。我想在实例化一个新对象时强制执行这个逻辑。
标签: ruby oop inheritance