【问题标题】:Can categories be inherited?类别可以继承吗?
【发布时间】:2013-06-07 09:47:28
【问题描述】:

假设我有一个类 Parent 并且孩子是 Child1 和 Child2。

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

-(void) Redraw;

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

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

-(void) Redraw

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

可以吗?

什么是好的方法?

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

【问题讨论】:

标签: objective-c objective-c-category


【解决方案1】:

我不同意给出的答案:

A.: 不是真的,那个类的方法战胜了类的方法。这是一个实现细节,但行为是定义的。

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

B. 但这没关系。您既没有在类中定义的类别中定义方法,也没有在两个冲突的类别中定义方法。城市。根本不适用于您的情况。它适用于这样的事情:

@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。但这不是冲突,因为在这种情况下适用优先规则:子类覆盖方法。

你可以这样做。

编辑:

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

【讨论】:

  • 只是一个问题先生:您是否尝试过您在上面解释的内容?我现在正在编写一些测试(也许凌晨 2 点不是编写代码的合适时机,但我只是好奇)并且代码甚至无法编译并抱怨“重复符号”。
  • Signore,我多次为谓词实现了这个“系统”。我编译了上面的代码。如果您有重复符号错误,您应该执行以下操作: 1. 检查您的复制和粘贴。你犯了一个错误,复制和粘贴代码。 2. 报告,您在哪里得到重复的符号。作为一个经验丰富的 Objective-c 程序员,你知道,类和类别打开一个单独的命名空间,要在不同的类和类别上获得重复的符号真的很难。这是一个示例项目:cocoading.de/webspace/CategoriesAndClasses.zip
  • 我必须澄清:用“cit”。我的意思是你回答中的引用。文件引用。在我的回答中并不完全正确,因为超类中的方法不能与子类中的方法发生冲突。
  • 从日光浴回来。 (终于夏天了!) :) 我想添加一个东西,但我认为它几乎在所有情况下都得到了满足。应该加载将此类类别添加到子类的所有 Bundle。
【解决方案2】:

我会用 cit 重播。来自this answer

让我们这样说吧。不要使用类别、句号、ever、答案结尾来覆盖方法。

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

【讨论】:

  • 请看我的回答。
【解决方案3】:

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

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

【讨论】:

  • 在任何情况下,在类别的类中定义的类别中也没有方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多