와 슈퍼 클래스를 대체하는 것은 가능 (종류 또는 유사한 것을 사용) 목표 - C에서 같은 것을 할 것입니다 Element에 멤버 변수를 넣었지만 Node 클래스에 대한 모든 래퍼 함수를 작성해야합니다. 어떻게 든 확장 할 수 있습니까?목적은-c는 클래스
감사합니다.
와 슈퍼 클래스를 대체하는 것은 가능 (종류 또는 유사한 것을 사용) 목표 - C에서 같은 것을 할 것입니다 Element에 멤버 변수를 넣었지만 Node 클래스에 대한 모든 래퍼 함수를 작성해야합니다. 어떻게 든 확장 할 수 있습니까?목적은-c는 클래스
감사합니다.
이전에는 가능했지만 필요한 기능 (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>
프로토콜의 메시지를 이해하는 모든 개체)로 선언해야합니다. 당신이 Element
가 Sprite
에서 다른 인스턴스 인 유연한 될 수 있다면
첫 번째 방법은 괜찮습니다. 그렇게 할 수 없다면, 두 번째 접근법도 훌륭하게 작동합니다.
문제는 Sprite와 Node가 이미 인터페이스이기 때문에 두 case.i에서 래퍼 함수를 작성해야하므로 Node를 멤버 변수로 놓고 문제가 해결됩니다. 감사합니다 – blejzz
"Spritely"로 +1해야했습니다. – NJones