Objective-C协议和类别可以被inheritance吗?

我对Objective-C协议和类别的一些概念有些困惑。

Objective-C中的子类可以inheritance协议和类别吗?

类别是在运行时添加到类中的方法的集合。 由于Objective-C使用dynamic绑定,这意味着类中定义的方法对于类及其所有子类都是可用的。 具体来说,select器在被调用的地方被绑定到方法上,而不是在编译期间或程序第一次加载时。 当类别被加载时,类别被添加到类别中。

协议定义方法签名的集合,符合它们的类承诺实现。 一旦一个类声明它符合一个协议,就好像这个类的接口中声明的方法一样,inheritance的规则也是一样的:子类inheritance了协议方法的声明和实现,但是也可以select覆盖超类实现。

协议本身可以扩展生成新的协议。 由原始协议中方法的超集组成。 实际上,就像大多数类inheritance自NSObject类一样,大多数协议都扩展了NSObject协议(协议名和类名在不同的名字空间中)。 这使得声明为id<WhateverProtocol>对象可以发送诸如-retain-release等基本消息而不会产生编译器警告。

类别就像一个类的扩展。 你可以将自己的方法添加到其他类(如NSString或其他)。 这意味着任何子类都可以获得这些方法。

而协议是一个方法列表,要求类确认实现它的所有类(除非使用@optional标签)。 所以inheritance它的子类没有意义。

编辑:

对于协议实现,我意识到我还不够清楚。 Protocol在它的超类中实现的方法可以被inheritance,但是,我的意思是通常你不需要重写你的超类的协议方法。

你的问题不清楚。 你可能会问子类是否inheritance它们的超类的协议和类别。 @theAmateurProgrammer已经回答了这个问题。

您也可能会问,类别和协议是否可以自己inheritance其他类别和协议。 对于类别,答案是否定的。 对于协议,答案是肯定的,事实上协议几乎总是像这样的类inheritance:

 @protocol SomeProtocol <NSObject> ... @end 

这就是说符合<SomeProtocol>任何东西也符合<NSObject> (这是一个协议以及一个类)。 这允许你调用像respondsToSelector:这样的方法,这对于大多数协议实现来说是非常重要的。

协议就像Java中的接口。 所以,一个类提供了一个访问它的协议。

你可以像在Java中一样“分类”协议,你可以“分类”接口。

另一方面,类别可以将更多方法添加到类中。 限制是你不能添加任何具有类别的实例variables。 您只能访问现有的实例variables。

这是非常有用的,因为它避免了创build一个大的脆弱的子类层次结构。

所以,底线是,如果你想要一个视图不同的类符合一个标准的接口,然后使用一个协议。 如果你想添加一些方法到现有的类没有子类的麻烦,去一个类别。

然而,有一点要记住的是,当您将方法添加到某个类别时,我已经被同事提醒了 – 就是您正在使这些方法在任何地方都可用。 我已经在几个地方看到,一个常见的新手错误是疯狂的分类,一直使用它们,而不是创build新的类来完成这个工作。

所以,如果你正在考虑的新类别方法真的是特定的,或者说是与业务function紧密耦合的话,那么这个方法可能不应该是一个类别。 他们真的只能用于基类的通用添加。

NSObject符合NSObject协议

 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } 

假设我们有一个NSObject的子类

 @interface FTGAnimal : NSObject @end @implementation FTGAnimal @end 

我们可以看到FTGAnimal实际上符合NSObject协议

 if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) { NSLog(@"FTGAnimal conforms to NSObject protocol"); }