#import <Foundation/NSObject.h>
#import <stdio.h>

@interface Animal : NSObject
{
    const char * name;
}
- (void) play;
@end

@implementation Animal
- (void) play {}
@end

@interface Dog : Animal
- (id) init: (const char *) name;
- (void) play;
@end

@implementation Dog
- (id) init: (const char *) value {
    self = [super init];
    if (self != nil) {
        self->name = value;
    }
    return self;
}
- (void) play {
    printf("わんわん！%sだよ\n", name);
}
@end

@interface Cat : Animal
{
    int sleep;
}
- (id) init: (const char *) name  flag: (int) sleep;
- (void) play;
@end

@implementation Cat
- (id) init: (const char *) value flag: (int) flag  {
    self = [super init];
    if (self != nil) {
        self->name = value;
        self->sleep = flag;
    }
    return self;
}
- (void) play {
    printf("にゃあ！%sだよ\n", name);
    if(sleep == 1) {
        printf("...でも寝る\n");
    }
}
@end


int main(int argc, char *argv[]) {
    int i;
    id pets[] = {
        [[Dog alloc] init:"ぽち"],
        [[Cat alloc] init:"たま" flag:1]
    };

    for(i = 0; i < (sizeof(pets)/sizeof(pets[0])); i++) {
        [pets[i] play];
    }

    for(i = 0; i < (sizeof(pets)/sizeof(pets[0])); i++) {
        [pets[i] release];
    }
    return 0;
}
