【问题标题】:Calling a different superclass init method from custom initializer in MacRuby从 MacRuby 中的自定义初始化程序调用不同的超类 init 方法
【发布时间】:2013-01-31 01:43:28
【问题描述】:

在 Objective C 中,自定义 init 方法必须调用超类的指定初始化程序。考虑以下用于 NSView 子类的自定义 init 方法:

- (void)initWithFrame:(CGRect)aFrame andName:(NSString *)aName {
    if(self = [super initWithFrame:aFrame]){
        //set up object
    }
}

然而,MacRuby 只提供super 关键字,它只是尝试在超类中调用相同的方法。然而,由于这是一个自定义初始化程序,超类没有这样的方法。

解决这个问题的标准方法是什么?我确实看到了这个问题:MacRuby custom initializers 但我不能说我非常了解答案,它似乎也不是一些被广泛接受的解决方案。由于 MacRuby 现在比写这篇文章时早了几年,我希望现在有一个更清晰、标准的解决方案。

【问题讨论】:

    标签: objective-c initialization macruby rubymotion


    【解决方案1】:

    在 ruby​​motion 中(我认为 MacRuby 也有这种行为)有两种类型的类:纯 Ruby,使用 initialize,以及派生自 Objective-c 类的类。最好不要将两者混用。如果你是一个objective-c 类的子类,你应该使用init 方法。你的 initialize 方法永远不会被调用!

    这是因为NSObject##new 方法调用init,而不是initialize(实际上即使这样也过于简单化了,但抽象是有效的)。

    您上面的示例令人困惑,因为您调用的是init 而不是initWithFrame。您必须调用父类的指定初始化程序 - 在这种情况下,使用 super

    如果您调用的初始化程序(在本例中为 init,调用 您的 初始化程序,则您使用了错误的初始化程序 - 在这种情况下无法逃避递归循环。

    因此,您不能完全选择在父级上调用哪个方法。但是,您可以使用自己的 init 方法:

    def initWithTitle(title)
      initWithFrame(CGRectZero)
      @title = title
      return self
    end
    

    我会这样写这个方法:

    def initWithTitle(title)
      initWithFrame(CGRectZero).tap do
        @title = title
      end  # that way I never forget to return self
    end
    

    【讨论】:

    • 为了清楚起见,您是说我应该简单地调用self 上的指定初始化程序,对吗?似乎有道理。
    • 没错。或者从子类的角度来看,你可以重写指定的初始化器并调用super,或者编写一个不同的初始化器并在self上调用超类的指定初始化器。
    • 谢谢,很有意义。事实上,我认为我真正的困惑源于从未真正理解指定初始化程序的概念。你也解决了这个更广泛的问题!
    【解决方案2】:

    如果我理解正确,您想在 ruby​​motion 中创建自己的自定义初始化方法,但仍调用原始的 init 方法。

    我经常做这样的事情:

    #custom initializer
    def initialize
     self.init # <--calls 'init' from parent
    
     #stuff happens here
    end
    

    而不是调用super,只需调用init方法,这是因为你的对象在它到达初始化时已经分配了。如果你有变量要传递,那么将它们传递给任何被认为是初始化器的方法。

    (编辑:可能需要自我。)

    【讨论】:

    • 如果您将参数传递给初始化程序,这似乎不起作用。例如:gist.github.com/4693598
    • 也许这是 ruby​​ motion 和 macruby 之间的区别。我无法测试你的,因为它不受 ruby​​motion 的支持,但这就是我做其他课程没有问题的方式......也许是“自我”。需要吗?我觉得这可能不会有所作为......
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多