Вопрос про категории
От: XJess  
Дата: 10.08.11 07:59
Оценка:
Привет всем!
В двух книгах (правда, на русском, то бишь переведенных) я прочла, что с помощью категории можно заместить метод в классе. Так вот — решила провести эксперимент.

Есть такой код:

Файл Сat.h:


#import <Foundation/Foundation.h>

@interface Cat : NSObject
{
@private
    int weight;
    int birthday;
}
- (NSString *)description;
- (void) Tail;
@end


Файл Cat.m:

#import "Cat.h"

@implementation Cat

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
        weight = 65;
    }
    
    return self;
}

- (void) TailImpl
{
    NSLog(@"Cat's tail");
}

- (void) Tail;
{
    [self TailImpl];
}

- (NSString *)description
{
    return @"Big, fat Cat";
}

@end


Файл main.m:


#import <Foundation/Foundation.h>
#import "Cat.h"

@interface Cat (Crack)
- (int) weight;
@end

@implementation Cat (Crack)

- (int) weight
{
    return weight;
}
@end

@interface NSObject (Crack)
- (NSString*) description;
@end

@implementation NSObject (Crack)
- (NSString*) description
{
    return @"Crazy Cat";
}
@end

int main (int argc, const char * argv[])
{

    @autoreleasepool
    {
        Cat* cat = [Cat new];
        [cat Tail];
        NSLog(@"%d", [cat weight]);
        
        NSNumber* pNum = [NSNumber numberWithInt:10];
        // insert code here...
        NSLog(@"%@", cat.description);
        
    }
    return 0;
}


Так вот — в этой программе я попыталась заместить метод description с помощью категории. (В принципе NSLog и так должен вызвать description, но я для ясности решила дернуть его здесь руками.)
Но в итоге выводится совсем не то, что я ожидала:

Cat's tail
65
Big, fat Cat


Вопрос — так можно все-таки заместить или книга врет?
Re: Вопрос про категории
От: salvequick  
Дата: 10.08.11 10:37
Оценка:
Здравствуйте, XJess, Вы писали:



XJ>Так вот — в этой программе я попыталась заместить метод description с помощью категории. (В принципе NSLog и так должен вызвать description, но я для ясности решила дернуть его здесь руками.)
XJ>Но в итоге выводится совсем не то, что я ожидала:
XJ>
XJ>Cat's tail
XJ>65
XJ>Big, fat Cat
XJ>
XJ>Вопрос — так можно все-таки заместить или книга врет?


Книга не врет . Вы в примере заменили метод description у NSObject.

Попробуйте выполнить .


NSObject *obj = [[NSObject alloc] init];
NSLog(@"%@", obj);



Будет вывод Crazy Cat.
Re[2]: Вопрос про категории
От: salvequick  
Дата: 10.08.11 10:42
Оценка: 1 (1)
т.е description будет переопределен только для NSObject.
Re[3]: Вопрос про категории
От: salvequick  
Дата: 11.08.11 05:36
Оценка:
S>т.е description будет переопределен только для NSObject.

И это тоже не совсем правильно.
desсription будет переопределен и у классов наследников NSObject.
Например если создать NSTextField или NSImageView у них description также даст вывод Crazy Cat.
Т.е в данном примере description переопределен у всех наследников NSObject.
Однако у Cat description переопределен явно и поэтому выызвается именно он.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.