【问题标题】:Ruby execute code when inherited class part initialisedRuby 在继承的类部分初始化时执行代码
【发布时间】: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


【解决方案1】:
class A
    def initialize
        puts "Inside A's constructor"
    end
end

class B < A
    def initialize
        super
        puts "Inside B's constructor"
    end
end

A.new
B.new

输出:

Inside A's constructor
Inside A's constructor
Inside B's constructor

【讨论】:

    【解决方案2】:

    当然可以,只需在子类初始化方法中调用super

    class A
      def initialize
        puts "Inside A's constructor"
      end
    end
    
    class B < A
      def initialize
        super
        puts "Inside B's constructor"
      end
    end
    
    A.new
    B.new
    

    输出:

    Inside A's constructor
    Inside A's constructor
    Inside B's constructor
    

    【讨论】:

    • 如果您查看我的原始问题,我很清楚您可以使用 super 从继承类调用构造函数,但这有点失去了我所追求的目的。 ..
    • @MikeyS。我非常好奇你的目的是什么。这个问题根本没有说清楚。 super 完全符合您的要求...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多