2010-05-11 2 views
0
@interface ClassB <ClassADelegate> : ClassA 

id <ClassBDelegate> delegate; 

@end 

코드에서 알 수 있듯이 ClassB는 ClassA의 하위 클래스이며 A 클래스의 형성 프로토콜을 처리합니다. 그러나 "delegate"변수는 복제됩니다. (ClassA도 "델리게이트"를 가지고있다)(Cocoa) 동시에 서브 클래 싱 및 위임을 할 수 있습니까?

실제로 서브 클래 싱없이 할 수 있지만 코드가 복잡하다. 즉, ClassA의 변수/함수를 사용하려면 [[ClassB classA] doSomething] 대신 [classB doSomething]을 사용합니다. 여기서 doSomething :은 ClassA의 함수입니다.

나를 위해 깔끔한 방법이 있습니까?

답변

2

게시 한 샘플을 보면 ClassB는 ClassADelegate 프로토콜을 따르고 ClassB에는 ClassBDelegate를 준수하는 대리인 개체가 있습니다. ClassB가 ClassADelegate를 준수하고 ClassA 하위 클래스이기도하다면 ClassADelegate 메소드가 ClassA의 일부로 시작되지 않는 이유가 궁금합니다.

그래서이 설정의 아키텍처에 대해 다시 생각하고 모델 개체와 대리인을 별도로 유지하려고합니다. 이는 대리자 패턴의 첫 번째 지점을 구분합니다. 이것이 응용 프로그램에 이해가되지 않는다면, 하위 클래스 화가 달성하려는 의미에 대한 좀 더 구체적인 정보가 도움이 될 것입니다.

오늘 일부 작업을 수행하면서 Apple이 위임 및 서브 클래 싱을 사용하지만 분명히 제안한 방식대로 사용하지 않는다는 사실이 나에게 발생합니다. NSTextField 및 NSControl 클래스를 살펴보십시오. 물론 NSTextField는 NSControl을 하위 클래스로하고 고유 한 대리자 메서드를 가지고 있지만 NSControl에도 대리자 메서드 집합이 있습니다. 그러나 NSTextField는 NSControl의 위임 프로토콜 (실제로는 프로토콜로 지정되지 않음)을 준수하지 않습니다.