2014-02-15 4 views
3

기본 클래스와 2 개의 하위 클래스가있는 클래스 클러스터를 만들고 싶습니다. 기본 클래스의 인스턴스를 작성하면 일부 조건에 따라 서브 클래스를 리턴해야하지만 직접 서브 클래스를 작성하면이를 작성해야합니다. 기본 클래스에 다음 코드를 작성했습니다.슈퍼 바인딩이 컴파일 타임에 정적으로?

+ (id)allocWithZone:(NSZone *)zone { 
    // prevent infinite recursion 
    if ([self isEqual:Base.class]) { 
     // if self is the base class, return a correct subclass 
     if (somecondition) { 
      return [SubclassA alloc]; 
     } 
     return [SubclassB alloc]; 
    } 
    // otherwise, alloc is called on a subclass 
    // call NSObject's alloc 
    return [super allocWithZone:zone]; 
} 

및 작동하지만 정말 놀랍습니다. 즉, 하위 클래스에서 호출 할 때 Super가 Base 클래스의 수퍼 클래스 (NSObject)가 아니라 Base 클래스가 아닌 이유는 무엇입니까 (SubclassA에서 호출 되었기 때문에 수퍼 클래스는 Base 임). 마치 Base에서 상속받은 allocWithZone : 메소드 호출이 호출자의 실제 런타임 클래스가 아닌 Base에 대해 항상 상대적으로 평가 된 것과 같습니다. Java 및 다른 OO 언어의 비슷한 코드가 작동하지 않아 무한 재귀가 발생한다고 생각합니까? 이 코드가 잘못 되었습니까?

답변

2

코드가 정확합니다. [super ...]은 항상 메소드를 구현하는 클래스의 수퍼 클래스를 사용합니다. 코드에서 +allocWithZone:Base 클래스로 구현되므로 [super allocWithZone:zone]은 다음 +allocWithZone: 구현을 검색 할 때 Base의 수퍼 클래스를 사용하여 호출합니다.

+0

어딘가에 기록되어 있습니까? 나는 clang 문서에서 조금 둘러 보았지만 찾지 못했습니다. – wujek

관련 문제