다들 아시다 시피, Objective-C 는 Abstract Class가 없습니다.
OO를 Design 할때, Abstract Class를 사용해야 할 일이 있습니다. ( 예 : Factory Method Pattern )
문법단에 없는 녀석이기에, Compiler Level에서는 Error를 발생시킬순 없지만,
RunTime에 강제하도록 하는 방법을 한번 살펴보도록 하겠습니다.
아래에 원문이 있으니, 한번씩 읽어보세요 :)
http://stackoverflow.com/questions/1034373/creating-an-abstract-class-in-objective-c
원리는 간단합니다.
init 과 override를 강제 시키고 싶은 곳에서 Exception을 날린다.
-(id) init {
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil];
return nil;
}
위의 예제 코드 와 같이 말이죠
해당 Class를 그냥 사용하면, 아래와 같이 RunTime Error가 발생됩니다.
장문의 Exception Throw를 그냥 매번 쓰고 있자니 답답하군요
prefix header에 아래와 같이 정의 합니다.
#import <Availability.h>
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
#define mustOverride() @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil]
그리고 -(id) init은 아래와 같이 변경
-(id) init {
mustOverride();
return nil;
}
자 이러면 쉽게 되는군요.
compile 단에서 이루어지는게 아니라, 아쉽지만,
그렇다고 아무런 안전장치 없이 또 사용하는것보단 나은것 같습니다 ^^
사족으로 Java의 Interface 대신 Protocol 을 사용하고 있긴 하지만, Interface와 abstract class는 문법상으로 좀 제공해줬으면 합니다.
그럼 좀 더 great할것 같군요 :)