假设我有一个班级父,孩子是Child1和Child2。
我声明了Parent + ParentCategory然后我声明了一个方法:
-(void) Redraw;
稍后我希望Child1的Redraw
函数与Child2的Redraw
函数不同。
我可以声明Child1 + Child1Category,然后覆盖
-(void) Redraw
Child1的-(void)Redraw
可以调用父类别中的函数吗?
能做到吗?
什么是好方法?
我知道类可以互相继承。我知道协议可以相互扩展。我想知道为什么类别没有?
答案 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
由于同样的原因,B级别没有冲突,因为A级别没有冲突。
有人可能会说,存在冲突,因为B从A继承了-doSomething。但这不是冲突,因为在这种情况下适用优先级规则:子类覆盖方法。
你可以做到。
编辑:
只需将方法添加到课程中即可检查问题。会编译吗?在冲突的情况下,它不会。在你的情况下,它会。
答案 1 :(得分:2)
我会用cit重播。来自this answer:
让我们这样说吧。不要使用类别,句号,永远,结束答案来覆盖方法。
这样做的原因是,虽然确切地知道类别的方法总是胜过一个类方法(也就是说,如果你在一个已经在类中声明的类别中实现了一个方法,那么你正在使用该方法的类别进行扩展将调用该类别。)当您有多个类别实现相同的方法时,优先实现是未定义的
答案 2 :(得分:0)
使用类别来执行此操作并不明智。类别将方法添加到当前类。如果有多个具有相同名称的方法,它将替换旧方法(它不是覆盖)。但不幸的是,很难说哪一个被替换了。不要这样做或者你可能遇到麻烦。
您可能无法从子类别中调用Parent中的方法。这里最合适的设计是协议。