维基百科将“呼叫超级”归类为反模式,我真的不明白为什么。该模式经常用于Objective-C / cocoa;例如init / dealloc,drawrect,awakefromnib都需要你调用super。我在这里误解了这个概念吗?
答案 0 :(得分:14)
正如在the article,中所说,调用作为反模式的超级方法是必需,即超类“期望”覆盖方法以使功能完整 - 但它没有明确表达这种期望。它还希望您调用超级实现。两者都是程序工作所必需的。
这是一个反模式,因为程序员的 intent 无法从代码中推断出来。如果你的同事决定继续工作,他们就不会知道你对班级的期望,因此可能会遇到问题和/或烦恼。
因此,如果您希望覆盖某个方法的某些部分,但需要保留其他部分,建议使用template method pattern,其中保留所有不能替换的内容(私有)方法,然后调用另一个 - 完全独立 - ,必须实现,以便程序工作(在某些语言中,它甚至不会否则编译)。 这样,你就可以确保重要的东西保持原样,扩展课程的任何人都会知道该做什么,同时对其他实现细节一无所知。
Objective-C没有抽象或虚方法,但如果调用super方法,则可以通过显式引发异常来实现相同的效果。这样,如果您的同事忘记覆盖该方法,程序将崩溃 - 它将崩溃并显示他们将理解的错误消息,这将使他们能够比一些不稳定更快更容易地理解和解决问题没有解释的行为,由于功能不完整。
答案 1 :(得分:3)
问题的要点是:
..但是,语言本身可能无法实现 强制执行此呼叫规定的所有条件是使其成为现实的原因 反模式。
所以作者嘲笑程序员必须做一些他们认为语言应该为他们做的事情。
wikepedia文章Call Super中提到的解决方案是:
解决这些问题的更好方法是使用模板 方法模式,其中超类包括纯抽象方法 必须由子类实现并具有原始的 方法调用该方法
问题是Objective-c没有虚函数。它只有消息,所以你无法实现wikepedia的建议。