Как я подкласс NSDate? - PullRequest
4 голосов
/ 17 апреля 2010

Я впервые попытался дать подкласс NSDate, чтобы дать ему 2 метода, которые мне нужны. Компилируется нормально, но во время выполнения я пытаюсь получить к нему доступ, я получаю сообщение об ошибке.

Допустим, я просто хочу, чтобы текущая дата не изменялась в подклассе:

[myNSDate date];

Я получаю ошибку

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

чем отличается?

Ответы [ 2 ]

7 голосов
/ 17 апреля 2010

Ответ NSD, я просто попытаюсь повторить простым языком. NSDate не простой класс, который вы могли бы легко подклассить. Это кластер класса , что вкратце означает, что когда вы получаете значение типа NSDate, это фактически экземпляр другого частного класса, который имеет тот же интерфейс, что и NSDate. Другими словами, NSDate это не то, что вы хотели бы подкласс.

Если вы просто хотите добавить методы (не переменные экземпляра), вы можете легко сделать это, используя категорию:

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

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

Теперь вы можете позвонить [date doFoo]. См. Также учебник по подклассам кластера класса , автор Mike Ash.

1 голос
/ 17 апреля 2010

NSDate - это кластер классов, и вы не должны делать никаких предположений о базовом типе, который возвращают его методы, а также не пытаться создавать подклассы, если вы точно не знаете, что делаете. Если вы хотите расширить его, сделайте это с категорией.

...