客观的c类和inheritance
如果一个方法在该类的一个类和一个类别中定义,则不确定哪个实现将被调用。
但是这与inheritance是如何相互作用的呢? 特别:
- 给定子类中的超类别方法和常规方法,是否保证在子类的成员上调用子类实现会获胜?
- 给定一个超类常规方法和一个子类别方法试图覆盖它,是否保证子类别实现将赢得调用的子类的成员?
- 给定一个超类别方法和一个子类别方法,是否保证子类别方法将赢得调用的子类的成员?
让我们这样说吧。 不要用类别,句点,回答结束来覆盖方法。
如果一个方法在该类的一个类和一个类别中定义,则不确定哪个实现将被调用。
那是不正确的; 类别方法将永远胜利。 但是,如果你有多个类别实现相同的方法,那么“哪一个获胜”是不确定的。
它通常是“最后装载胜利”,但这也不是一个硬性的规则。
请注意,由于许多类将在内部按照代码组织的目的在类别之间进行划分,因此无论如何您都不能依赖第一条规则。
总之,约书亚所说的是什么; 不要使用类别覆盖方法。
除了inheritance原因之外,当你这样做的时候,你也是在恶毒地破坏封装。 这不是基于类别的实现覆盖现有的方法,而是完全取代它。 因此,如果不重现每个最后的内部实现细节(包括错误),那么replace就不太合适,debugging起来也很困难 。
从我testing
- 给定子类中的超类别方法和常规方法,是否保证在子类的成员上调用子类实现会获胜? => 子类获胜
- 给定一个超类常规方法和一个子类别方法试图覆盖它,是否保证子类别实现将赢得调用的子类的成员? => 子类别获胜
- 给定一个超类别方法和一个子类别方法,是否保证子类别方法将赢得调用的子类的成员? => 子类别获胜
看看testing类别和子类