我如何继承NSDate?

时间:2010-04-17 04:49:23

标签: objective-c nsdate

我第一次尝试subClassed NSDate给它2个我需要的方法。编译很好,但在运行时我尝试访问它我得到一个错误。

假设我只想要在子类中未修改的当前日期:

[myNSDate date];

我收到错误

-[NSDate initWithTimeIntervalSinceReferenceDate:]: method only defined for 
 abstract class.  Define -[myNSDate initWithTimeIntervalSinceReferenceDate:]!

有什么不同?

2 个答案:

答案 0 :(得分:7)

NSD的答案核心,我只想简单地重申一下。 NSDate不是一个你可以轻松子类化的简单类。它是class cluster,简而言之,当您获得类型NSDate的值时,它实际上是与NSDate具有相同接口的不同私有类的实例。换句话说,NSDate不是你想要的子类。

如果您只想添加方法(而不是实例变量),可以使用类别轻松完成:

@interface NSDate (MyExtensions)
- (void) doFoo;
@end

@implementation NSDate (MyExtensions)
- (void) doFoo {
    NSLog(@"Foo");
}
@end

现在您可以致电[date doFoo]。另见Mike Ash的class cluster subclassing tutorial

答案 1 :(得分:1)

NSDate是一个类集群,您不应该对其方法返回的基础类型做任何假设,也不应该尝试对其进行子类化,除非您确切知道自己在做什么。如果要扩展它,请使用类别。