2012-03-10 3 views
0

와 슈퍼 클래스를 대체하는 것은 가능 (종류 또는 유사한 것을 사용) 목표 - C에서 같은 것을 할 것입니다 Element에 멤버 변수를 넣었지만 Node 클래스에 대한 모든 래퍼 함수를 ​​작성해야합니다. 어떻게 든 확장 할 수 있습니까?목적은-c는 클래스

감사합니다.

답변

3

이전에는 가능했지만 필요한 기능 (class_setSuperclass)은 오래 전에 사용되지 않으므로 더 이상 사용할 수 없습니다 (이는 아마도 좋은 일입니다).

몇 가지 다른 방법으로이 문제를 해결할 수 있습니다.

가장 좋은, 나는 생각한다, 내부 Sprite 인스턴스에 대한 모든 관련 스프라이트-LY 방법에 전달 후 Sprite 멤버 변수를 가지고 SpriteElement라는 새로운 Element 서브 클래스를, 만들기 위해, 그리고 것입니다. 합니다 (Sprite 클래스가 -doSpritelyThing 방법을 선언하는 것을 나는 믿고있어)

@protocol Sprite <NSObject> 

- (void)doSpritelyThing; 

@end 

:

당신은 또한 당신이하는 Sprite에 대해 원하는과 같이 모든 것들을 캡처하는 새로운 프로토콜을 정의 할 수 있습니다

@interface Element (Sprite) <Sprite> 

@end 
:

그런 범주에, 당신은 Element 클래스는 <Sprite> 프로토콜을 준수 함을 선언 할 수

그들 때문에 같은 방법을 구현 :

@implement Element (Sprite) 

- (void)doSpritelyThing { 
    ... 
} 

@end 

당신은 또한 Sprite 클래스는 Sprite 프로토콜을 준수 함을 선언 할 아마도 것입니다 : 코드에서 다음

@interface Sprite() <Sprite> 

@end 

을 대신 선언하여 변수가 Element * 인 경우 id<Sprite> (<Sprite> 프로토콜의 메시지를 이해하는 모든 개체)로 선언해야합니다. 당신이 ElementSprite에서 다른 인스턴스 인 유연한 될 수 있다면


첫 번째 방법은 괜찮습니다. 그렇게 할 수 없다면, 두 번째 접근법도 훌륭하게 작동합니다.

+0

문제는 Sprite와 Node가 이미 인터페이스이기 때문에 두 case.i에서 래퍼 함수를 ​​작성해야하므로 Node를 멤버 변수로 놓고 문제가 해결됩니다. 감사합니다 – blejzz

+1

"Spritely"로 +1해야했습니다. – NJones