Objective c 子类必须实现其父类所遵循的协议吗?

Objective c 子类必须实现其父类所遵循的协议吗?,objective-c,protocols,subclassing,Objective C,Protocols,Subclassing,我有一个类,MyClass,它实现了NSCopying协议,还有一个类,MyClassChild,它继承自MyClassMyClassChild未实现NSCopying协议。我正在读的教科书说它必须,但我可以成功地建立!教科书错了吗 @interface MyClass : NSObject <NSCopying> { } @end @implementation MyClass -(id)copyWithZone:(NSZone *)zone { return se

我有一个类,
MyClass
,它实现了
NSCopying
协议,还有一个类,
MyClassChild
,它继承自
MyClass
MyClassChild
未实现
NSCopying
协议。我正在读的教科书说它必须,但我可以成功地建立!教科书错了吗

@interface MyClass : NSObject <NSCopying> {

}

@end

@implementation MyClass

-(id)copyWithZone:(NSZone *)zone
{
    return self;
}

@end

@interface MyClassChild : MyClass {

}

@end

@implementation MyClassChild

@end
@接口MyClass:NSObject{
}
@结束
@MyClass的实现
-(id)copyWithZone:(NSZone*)区
{
回归自我;
}
@结束
@接口MyClassChild:MyClass{
}
@结束
@MyClassChild的实现
@结束

您完全正确地认为,
NSCopying
要求对象实现
copyWithZone
。但是,
MyClass
实现了
copyWithZone
。因此,
MyClassChild
已经通过从
MyClass
派生实现了它。当您没有为
MyClassChild
中的
copyWithZone:
方法提供实现时,该类从其超类(
MyClass
)继承方法实现。这意味着
MyClassChild
确实符合
NSCopying
协议。如果在复制其实例时,
MyClassChild
需要执行一些特殊操作,则应覆盖
copyWithZone:
,并在那里执行任何需要执行的操作。希望有帮助


另外,我希望您认识到,返回
self
并不是实现
copyWithZone:

MyClassChild
继承了
NSCopying
的实现。即使你指定了

@interface MyClassChild : MyClass <NSCopying>
@接口MyClassChild:MyClass

编译器足够聪明,可以检查是否有任何超类实现了
-copyWithZone:

-1 NSObject没有实现
-copyWithZone:
,这是一个重要的方法。它确实实现了
+copyWithZone:
,但这是一个类方法。哎哟,你说得对。我甚至没有正确回答这个问题。这不是“不好”,这是完全错误的(除了在GC环境中)。您至少需要返回
[self-retain]然后只针对不可变对象。是的,只是为了快速编译它