客观的c类和inheritance

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

但是这与inheritance是如何相互作用的呢? 特别:

  • 给定子类中的超类别方法和常规方法,是否保证在子类的成员上调用子类实现会获胜?
  • 给定一个超类常规方法和一个子类别方法试图覆盖它,是否保证子类别实现将赢得调用的子类的成员?
  • 给定一个超类别方法和一个子类别方法,是否保证子类别方法将赢得调用的子类的成员?

让我们这样说吧。 不要用类别,句点,回答结束来覆盖方法。

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

那是不正确的; 类别方法将永远胜利。 但是,如果你有多个类别实现相同的方法,那么“哪一个获胜”是不确定的。

它通常是“最后装载胜利”,但这也不是一个硬性的规则。

请注意,由于许多类将在内部按照代码组织的目的在类别之间进行划分,因此无论如何您都不能依赖第一条规则。

总之,约书亚所说的是什么; 不要使用类别覆盖方法。

除了inheritance原因之外,当你这样做的时候,你也是在恶毒地破坏封装。 这不是基于类别的实现覆盖现有的方法,而是完全取代它。 因此,如果不重现每个最后的内部实现细节(包括错误),那么replace就不太合适,debugging起来也很困难

从我testing

  1. 给定子类中的超类别方法和常规方法,是否保证在子类的成员上调用子类实现会获胜? => 子类获胜
  2. 给定一个超类常规方法和一个子类别方法试图覆盖它,是否保证子类别实现将赢得调用的子类的成员? => 子类别获胜
  3. 给定一个超类别方法和一个子类别方法,是否保证子类别方法将赢得调用的子类的成员? => 子类别获胜

看看testing类别和子类