关于iphone:客观c类和继承

objective c categories and inheritance

如果一个方法同时在该类的类和类别中定义,则不定义将调用哪个实现。

但是,这与继承是如何相互作用的呢?明确地:

  • 给定一个超类类别方法和子类中的一个正则方法,当调用子类的一个成员时,是否保证子类实现会获胜?
  • 给定一个超类正则方法和一个试图重写它的子类类别方法,当调用子类的成员时,是否保证子类类别实现会获胜?
  • 给定一个超类类别方法和一个子类类别方法,当调用子类的一个成员时,是否保证子类类别方法会获胜?


我们就这么说吧。不要重写使用类别、句点、Ever和答案结尾的方法。


If a method is defined in both a class and a category on that class,
it is undefined which implementation will be called.

这是不正确的;类别方法将永远获胜。但是,不起作用的是,如果有多个类别实现了相同的方法,那么"哪一个赢"就没有定义。

这通常是"最后一场胜利",但这也不是一个硬性的规则。

请注意,由于许多类的内部实现将为代码组织的目的跨类别划分,因此您无论如何都不能依赖第一个规则。

简而言之,约书亚所说的;不要使用类别覆盖方法。

除了继承的原因之外,当您这样做时,您还恶意地破坏了封装。基于类别的实现并不是重写现有的方法,而是完全替换它。因此,如果您不重现每一个最后的内部实现细节,包括bug,那么您的替换将不会很好地工作,并且调试将非常困难。


根据我的测试

  • 给出了超类分类方法和正则方法子类,是否保证子类实现将获胜?当调用子类的成员时?=>子类获胜
  • 给出了一个超类正则方法和一个子类分类方法试图重写它,是否保证子类类别当调用子类的成员时,实现将获胜?= >子类类别获胜
  • 给出了一个超类分类方法和一个子类分类方法,是否保证子类类别方法在调用子类的成员?=>子类类别获胜
  • 看看测试类别和子类