Inheritance
Rectangle.h
Rectangle.m
Square.h
Square.m
main.m
결과
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가 아니더라도)를 사용 가능함.
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 |