[Objective C] 06 Inheritance

프로그래밍/iPhone Dev 2009. 10. 30. 11:38 Posted by galad
Inheritance

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

@interface Rectangle2: NSObject {
    int width;
    int height;
}

-(Rectangle2*) initWithWidth: (int) w height: (int) h;
-(id) initWithWidth2: (int) w height: (int) h;
-(void) setWidth: (int) w;
-(void) setHeight: (int) h;
-(void) setWidth: (int) w height: (int) h;
-(int) width;
-(int) height;
-(void) print;
@end


Rectangle.m
#import "Rectangle.h"
#import <stdio.h>

@implementation Rectangle2
-(Rectangle2*) initWithWidth: (int) w height: (int) h {
    self = [super init];
   
    if(self) {
        [self setWidth: w height: h];
    }
   
    return self;
}

// 테스트용. child class에서 super class의 생성자를 이용해서 object 생성하기 위한 constructor.
-(id) initWithWidth2: (int) w height: (int) h {
    self = [super init];
   
    if(self) {
        [self setWidth: w height: h];
    }
   
    return self;
}

-(void) setWidth: (int) w {
    width = w;
}

-(void) setHeight: (int) h {
    height = h;
}

-(void) setWidth: (int) w height:(int) h {
    width = w;
    height = h;
}

-(int) width {
    return width;
}

-(int) height {
    return height;
}

-(void) print {
    printf("width = %i, height = %i", width, height);
}
@end


Square.h
#import "Rectangle.h"

@interface Square: Rectangle2
-(Square*) initWithSize: (int) s;
-(void) setSize: (int) s;
-(int) size;
@end


Square.m
#import "Square.h"

@implementation Square
-(Square*) initWithSize: (int) s {
    self = [super init];
   
    if(self) {
        [self setSize: s];
    }
   
    return self;
}

-(void) setSize: (int) s {
    width = s;
    height = s;
}

-(int) size {
    return width;
}

-(void) setWidth: (int) w {
    [self setSize: w];
}

-(void) setHeight: (int) h {
    [self setSize: h];
}
@end


main.m
#import "Square.h"
#import "Rectangle.h"
#import <stdio.h>

int main(int argc, const char* argv[]) {
    Rectangle2* rec = [[Rectangle2 alloc] initWithWidth: 10 height: 20];
    Square* squ = [[Square alloc] initWithSize: 15];

    // Use parent's constructor
    Square* squ2 = [[Square alloc] initWithWidth2: 15 height: 25]; // <-- 1
    Square* squ3 = [[Square alloc] initWithWidth: 45 height: 55]; // <-- 2
   
    // print em
    printf("Rectangle: ");
    [rec print];
    printf("\n");
   
    printf("Square: ");
    [squ print];
    printf("\n");
   
    // update square
    [squ setWidth: 20];
    printf("Square after change: ");
    [squ print];
    printf("\n");
   
    printf("Square2: ");
    [squ2 print];
    printf("\n");
   
    printf("Square3: ");
    [squ3 print];
    printf("\n");
   
    // free memory
    [rec release];
    [squ release];
    [squ2 release];
    [squ3 release];
       
    system("PAUSE");
    return 0;
}


결과
Rectangle: width = 10, height = 20
Square: width = 15, height = 15
Square after change: width = 20, height = 20
Square2: width = 15, height = 25
Square3: width = 45, height = 55
계속하려면 아무 키나 누르십시오 . . .

Rectangle이란 이름을 갖는 클래스가 있어서 Rectangle2로 변경.

- Objective-C의 상속은 자바랑 비슷. child class 구현 시 method를 새롭게 구현하는 것으로 super class의 method를 간단히 override 할 수 있음.
- child class - Squre - 생성 시, super class - Rectangle2 - 의 생성자를 사용하려면
super class의 생성자의 반환 타입이 id 이어야만 함.(<--1 참고)
 super class의 생성자의 반환타입이 Rectangle2여서 Squre로 받을 수 없어서 컴파일 오류... 라고 설명에 나와있었으나

One thing left out here that is worth nothing is what would happen if you attempted to call the constructor for rectangle like: Square *sq = [[Square alloc] initWithWidth: 10 height: 15]. The answer is it will throw a compile error. Since the return type of the rectangle constructor is Rectangle*, not Square* this would not work. In such a case if you want this to occur, that's what the id variable is good for. Just change the Rectangle* return type to id if you wish to use your parent's constructors in a subclass.

해보니 잘 되네 ㅡ.ㅡ;;; (<-- 2 참고)
Objective-C 버전이 올라가면서 허용된 건지 어떤건지는 잘 모르겠음?
아무튼 child class object 생성 시 super class의 생성자(반환타입이 id가 아니더라도)를 사용 가능함.

'프로그래밍 > iPhone Dev' 카테고리의 다른 글

[Objective C] 08 Categories  (0) 2009.11.09
[Objective C] 07 DynamicTypes  (0) 2009.10.30
[Objective C] 05 The Id Type  (1) 2009.10.29
[Objective C] 04 Exceptions  (0) 2009.10.28
[Objective C] 03 Class Level Access  (0) 2009.10.27