2011-05-05 4 views
26

시나리오
나는 AbstractRequest라는 기본 클래스는 헤더 파일에 선언 된 유형 id <AbstractRequestDelegate>의 대리인 속성이있는 상황이 있습니다수퍼 클래스의 속성을보다 구체적인 형식으로 재정의하는 방법은 무엇입니까?

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate; 

추상 위임 프로토콜은 몇 가지 필요한 방법을 포함을하고 '추상적'이라는 단어로 표시된 AbstractRequestAbstractRequestDelegate은 하위 클래스/확장을위한 것입니다.

이 예는 ConcreteRequest 서브 클래스와 ConcreteRequestDelegates 확장 프로토콜이며, 둘 다 추상적 메소드에 추가 메소드를 추가합니다. 의도는 추상적이고 구체적인 클래스 메쏘드가 할당 된 하나의 델리게이트 인스턴스에 메시지를 보낼 수 있다는 것이다.

ConcreteRequest는 ConcreteRequestDelegate에 의해 정의 된 대리자의 메서드를 호출하려고합니다. 대리자의 형식이 id이기 때문에 컴파일러는이 메서드가 구현되지 않았을 수 있다는 경고를 제공합니다.

ConcreteRequest.m : 38 : 경고있다 - 메소드 구현

을 @dynamic @synthesize를 사용하거나 제공 재산 '대표는'정의 할 방법 '-delegate을'필요 문제
이 경고는 속성이 모두 id <AbstractRequestDelegate>으로 입력 되었기 때문에 합리적인 것입니다. 이 문제를 해결하기 위해 콘크리트 인스턴스에 할당 된 델리게이트가 id <ConcreteRequestDelegate>이어야한다는 것을 컴파일러에게 명확히 밝히고 싶습니다. 이것은 나에게 완벽하게 합리적인 소리, 그래서 추상적 한 대체 할 희망의 ConcreteRequest 헤더에 새 속성에 넣어 :

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate; 

을하지만 컴파일러는 아마 좋은 이유, 나와 함께 동의 곳이다. 나는 그것이 잘못된 타입의 수퍼 클래스 속성을 오버라이드하는 경고를 줄 것이라고 생각했을 것입니다. 대신이 새로운 속성을 다시 합성하도록 요구합니다. 거기에 가고 싶지 않습니다. 왜냐하면 수퍼 클래스의 메소드는 동일한 델리게이트 속성에 액세스 할 수 없기 때문입니다.


이되는 질문하는 방법에 대한 추가 유형 정보와 구상 서브 클래스에서 속성 '- 선언 다시'? 아니면 제 생각에 오류를 발견 할 수 있습니까? 아마도 이것은 지금까지 만나지 않은 매우 일반적인 문제 일 수 있습니다.

건배,
EP.

P.S. 이 작업에 나타나는 모든 클래스 및 프로토콜 이름은 실제 데이터가 아닙니다. 실제 클래스와 프로토콜 이름, 오픈 소스 또는 특허권과의 유사성은 순전히 우연의 일치입니다.

+2

. : D ... 당신은 모든 인터페이스와 클래스에 대한 코드를 게시 할 수 있습니까? 설명이 너무 깁니다. –

+0

이것은 이미 30 분이 소요됩니다. 어쩌면 다른 사람이 여러 단어를 볼 수 있습니다. 모두 실패하면, 나는이 클래스를 의사 코드로 작성하는 데 시간을 투자 할 것이다. – epologee

+0

: D 왜 다시 합성하면 문제가 생깁니 까 –

답변

11

경고는 이미 올바른 단서를 제공했습니다. 나는 오버라이드 서브 클래스에서 @dynamic을 사용했고 모두 좋다.

+1

하위 클래스에서 수행 한 작업에 대해 자세히 설명해 주시겠습니까? 또한 여전히 좋은 패턴이라고 생각하십니까? – shaunlim

+3

이 질문에 대한 답은 서브 클래스의 속성을 다시 선언하면 효과적으로 작동하지만 경고가 있다는 것입니다. 그런 다음 .m 파일의 구현 섹션으로 이동하여 "@dynamic samevariablename"행을 추가하면 @property 선언에 경고/문제가 발생합니다. 경고는 문제가 해결 된 장소와 다른 장소에 있기 때문에 수행 할 것으로 예상 할 수는 없지만 실제로는 발생합니다. 그것은 나를 위해서도 효과가있었습니다. –

2

그냥 ConcreteRequest.mid<ConcreteRequestDelegate>delegate을 합성하면 문제가 없습니다.

관련 문제