시나리오
나는 AbstractRequest
라는 기본 클래스는 헤더 파일에 선언 된 유형 id <AbstractRequestDelegate>
의 대리인 속성이있는 상황이 있습니다수퍼 클래스의 속성을보다 구체적인 형식으로 재정의하는 방법은 무엇입니까?
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
추상 위임 프로토콜은 몇 가지 필요한 방법을 포함을하고 '추상적'이라는 단어로 표시된 AbstractRequest
과 AbstractRequestDelegate
은 하위 클래스/확장을위한 것입니다.
이 예는 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. 이 작업에 나타나는 모든 클래스 및 프로토콜 이름은 실제 데이터가 아닙니다. 실제 클래스와 프로토콜 이름, 오픈 소스 또는 특허권과의 유사성은 순전히 우연의 일치입니다.
. : D ... 당신은 모든 인터페이스와 클래스에 대한 코드를 게시 할 수 있습니까? 설명이 너무 깁니다. –
이것은 이미 30 분이 소요됩니다. 어쩌면 다른 사람이 여러 단어를 볼 수 있습니다. 모두 실패하면, 나는이 클래스를 의사 코드로 작성하는 데 시간을 투자 할 것이다. – epologee
: D 왜 다시 합성하면 문제가 생깁니 까 –