다들 아시다 시피,  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할것 같군요 :) 

+ Recent posts