기본 클래스와 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 언어의 비슷한 코드가 작동하지 않아 무한 재귀가 발생한다고 생각합니까? 이 코드가 잘못 되었습니까?
어딘가에 기록되어 있습니까? 나는 clang 문서에서 조금 둘러 보았지만 찾지 못했습니다. – wujek