2

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

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

-(void) Redraw;

后来我想让Child1RedrawRedraw功能与 Child2 的功能不同。

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

-(void) Redraw

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

可以这样做吗?

什么是好方法?

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

4

3 回答 3

4

我不同意给出的答案:

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

你可以这样做。

编辑:

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

于 2013-06-07T22:06:12.767 回答
2

我会用一个 cit 重播。从这个答案

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

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

于 2013-06-07T09:56:46.397 回答
0

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

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

于 2013-06-07T10:01:30.250 回答