根据维基百科,为什么"召唤超级"被视为反模式?

eye*_*ire 7 cocoa design-patterns anti-patterns objective-c

维基百科将"呼叫超级"归类为反模式,我真的不明白为什么.该模式经常用于Objective-C/cocoa; 例如init/dealloc,drawrect,awakefromnib都需要你调用super.我在这里误解了这个概念吗?

链接到文章:http://en.wikipedia.org/wiki/Call_super

wel*_*rat 15

正如文章中所说,必要调用反模式的超级方法,即超类"期望"覆盖方法以使功能完整 - 但它确实如此,而不是明确地表达这种期望.它还希望您调用超级实现.两者都是程序工作所必需的.

这是一个反模式,因为程序员的意图不能从代码中推断出来.如果您的同事决定继续工作,他们就不会知道您对课程的期望,因此可能会遇到问题和/或烦恼.

因此,如果您希望覆盖某个方法的某些部分,但需要保留其他内容,建议使用模板方法模式,在这里保留所有不能在一个(私有)方法中替换的内容,然后调用另一个 - 完全独立 - 必须实现,以便程序工作(在某些语言中,它甚至不会编译).这样,你就可以确保重要的东西保持原样,而扩展课程的任何人都会知道该做什么,同时对其他实现细节保持着幸福.

Objective-C没有抽象或虚方法,但如果调用super方法,则可以通过显式引发异常来实现相同的效果.这样,如果您的同事忘记覆盖该方法,程序将崩溃 - 它将崩溃并显示他们将理解的错误消息,这将使他们能够比一些不稳定更快更容易地理解和解决问题没有解释的行为,由于功能不完整.