类别可以继承吗?

时间:2013-06-07 09:47:28

标签: objective-c objective-c-category

假设我有一个班级父,孩子是Child1和Child2。

我声明了Parent + ParentCategory然后我声明了一个方法:

-(void) Redraw;

稍后我希望Child1的Redraw函数与Child2的Redraw函数不同。

我可以声明Child1 + Child1Category,然后覆盖

-(void) Redraw

Child1的-(void)Redraw可以调用父类别中的函数吗?

能做到吗?

什么是好方法?

我知道类可以互相继承。我知道协议可以相互扩展。我想知道为什么类别没有?

3 个答案:

答案 0 :(得分:3)

我不同意给出的答案:

答:事实并非如此,该类别的方法胜过阶级方法。这是一个实现细节,但行为定义。

  

如果类别中声明的方法的名称与方法相同   在原始类中,或在另一个类别中的方法相同   class(甚至是超类),行为未定义为哪个   方法实现在运行时使用。

B中。 但这没关系。您既不在类中定义的类别中定义方法,也不在两个碰撞类别中定义方法。 cit。根本不适用于您的情况。它适用于这样的事情:

@interface A : NSObject
- (void)doSomething;
@end
@implementation A
- (void)doSomething {}
@end

@interface A (Addition)
- (void)doSomething;
@end
@implementation A (Addition)
- (void)doSomething {}
@end

如果我理解你是对的,你不想这样做。你想要这样的东西:

基础水平:

@interface A : NSObject
@end
@implementation A
@end

@interface A (Addition)
- (void)doSomething;
@end
@implementation A (Addition)
- (void)doSomething {}
@end

这不违反规则,因为类别中没有方法,而是在类中。

子类级别:

@interface B : A
@end
@implementation B
@end

@interface B (Addition)
- (void)doSomething;
@end
@implementation B (Addition)
- (void)doSomething {}
@end
  1. 由于同样的原因,B级别没有冲突,因为A级别没有冲突。

  2. 有人可能会说,存在冲突,因为B从A继承了-doSomething。但这不是冲突,因为在这种情况下适用优先级规则:子类覆盖方法。

  3. 你可以做到。

    编辑:

    只需将方法添加到课程中即可检查问题。会编译吗?在冲突的情况下,它不会。在你的情况下,它会。

答案 1 :(得分:2)

我会用cit重播。来自this answer

  

让我们这样说吧。不要使用类别,句号,永远,结束答案来覆盖方法。

这样做的原因是,虽然确切地知道类别的方法总是胜过一个类方法(也就是说,如果你在一个已经在类中声明的类别中实现了一个方法,那么你正在使用该方法的类别进行扩展将调用该类别。)当您有多个类别实现相同的方法时,优先实现是未定义的

答案 2 :(得分:0)

使用类别来执行此操作并不明智。类别将方法添加到当前类。如果有多个具有相同名称的方法,它将替换旧方法(它不是覆盖)。但不幸的是,很难说哪一个被替换了。不要这样做或者你可能遇到麻烦。

您可能无法从子类别中调用Parent中的方法。这里最合适的设计是协议。