Programming

Objective-C에서 메소드 오버로드?

procodes 2020. 7. 3. 22:10
반응형

Objective-C에서 메소드 오버로드?


내가 아는 한 Objective-C는 메소드 오버로드를 지원하지 않습니다. Objective-C에서 이에 대한 대안은 무엇입니까? 아니면 항상 다른 메소드 이름을 사용해야합니까?


올바른 objective-C는 메소드 오버로드를 지원하지 않으므로 다른 메소드 이름을 사용해야합니다.

그러나 "메소드 이름"에는 메소드 서명 키워드 ( ":"앞에 오는 매개 변수 이름)가 포함되므로 다음은 둘 다 "writeToFile"로 시작하더라도 두 가지 다른 메소드입니다.

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

두 메소드의 이름은 "writeToFile : fromInt :"및 "writeToFile : fromString :"입니다.


Objective-C가 메소드 오버로드를 지원하지 않더라도 Clang + LLVM은 C에 대한 함수 오버로드를 지원 합니다 . 찾고자하는 것은 아니지만 일부 상황에서는 유용 할 수 있습니다 (예 : 구현 약간 해킹 (캡슐에 반하는) 버전방문자 디자인 패턴 )

다음은 함수 오버로딩 작동 방식에 대한 간단한 예입니다.

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));

David는 Objective-C에서 메소드 오버로드가 지원되지 않는다는 점에서 정확합니다. 그런 의미에서 PHP와 비슷합니다. 그가 지적했듯이, 그가 예시 한 방식으로 다른 서명을 가진 두 개 이상의 방법을 정의하는 것이 일반적입니다. 그러나 "id"유형을 사용하여 하나의 메소드를 작성할 수도 있습니다. "id"유형을 통해 모든 객체 (및 NSNumber 클래스를 사용하는 프리미티브)를 메소드로 전송 한 다음 메소드 자체에서 해당 유형을 테스트하고 필요한 경우 적절한 예외를 처리 할 수 ​​있습니다. 성능이 약간 저하되지만 대량의 데이터를 처리하지 않는 한 명목상 또는 중요하지 않을 수 있습니다.

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

또한 다음과 같이 수행 할 수있는 객체 유형을 적용하기위한 프로토콜을 구현하기에 좋은 곳입니다.

(id<MyProtocol>)object

참고 URL : https://stackoverflow.com/questions/2286312/method-overloading-in-objective-c

반응형