gpt4 book ai didi

objective-c - 类别可以继承吗?

转载 作者:行者123 更新时间:2023-12-02 17:44:09 26 4
gpt4 key购买 nike

假设我有一个父类,子类是 Child1 和 Child2。

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

-(void) Redraw;

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

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

-(void) Redraw

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

可以吗?

什么是好的方法?

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

最佳答案

我不同意给出的答案:

A.:不是这样的,类别的方法胜过类的方法。这是一个实现细节,但行为定义。

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.

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

你可以做到这一点。

编辑:

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

关于objective-c - 类别可以继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16981064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com