4

나는 애플의 MVCNetworking example project을보고 있었고 AppDelegate의 인터페이스 정의 부분은 나를 혼란스럽게 만들고있다. 클래스가 개인적으로 프로토콜을 준수하도록하려는 이유는 무엇입니까?

@interface AppDelegate() <SetupViewControllerDelegate> 
    ... 

그래서이 클래스는 프로토콜에 부합하는 개인적으로입니다 :
@interface AppDelegate : NSObject 
{ 
    ... 

그러나하는 .m 파일에

우리가 이것을 가지고 다음 .H 파일에서 우리는이 있습니다. 그런데 헤더에서 공개적으로 선언하는 대신 왜 이것을하고 싶습니까?

답변

2

내부적으로 presentSetupViewControllerAnimated: 중 하나에서 구현이 SetupViewController 인 것처럼 보입니다. View Controller는 (속성 또는 다른 방식을 통해) 공개적으로 액세스 할 수 없기 때문에 공개 된 관점에서 프로토콜을 준수한다고 클래스를 선언 할 필요는 없습니다. 즉, 프로토콜은 클래스의 구현에만 관련이 있으며 공개하는 공용 인터페이스에는 관련되지 않습니다.

+0

'AppDelegate'는'SetupViewController'의 인스턴스에 대한 델리게이트를'self' (AppDelegate.m의 211 행)로 설정했기 때문에 프로토콜을 준수해야합니다. 그러나 다른 클래스가이 방식으로'AppDelegate'를 사용할 수 없으므로이 적합성은 사적으로 남아 있어야합니다. 귀하의 답변 주셔서 감사합니다! –

5

일반적으로 가능한 한 공개적으로 공개해야합니다. AppDelegate가 SetupViewController의 대리자가 될 수 있다는 사실은 아마도 AppDelegate가 SetupViewController를 제공 할 때 사용됩니다. 다른 클래스는 AppDelegate를 다른 SetupViewController의 위임자로 설정해서는 안되기 때문에 해당 준수를 공개적으로 알리는 것은 바람직하지 않습니다.

0

자신을 제외하고 누구도 프로토콜에 대해 알 필요가 없기 때문일 수 있습니다. 따라서 AppDelegate의 외부 누군가는 Appdelegate의 인스턴스를 다른 클래스 인스턴스에 대리자로 전달하지 않습니다. 따라서 내부적으로 이것을 전달할 수 있습니다.

1

다른 개체의 대리자가되고 싶지만 그렇게하면 클래스가 프로토콜의 필수 메서드를 준수 함을 명시 적으로 선언하지 않아서 컴파일러 경고를받을 수 있습니다. 다른 사람들이 언급했듯이, 객체 지향 프로그래밍의 핵심 중 하나는 information hiding입니다. 클래스에서 특정 프로토콜을 구현한다는 것을 헤더에서 선언하는 것은 바람직하지 않습니다. 왜냐하면 당신이 그 원칙을 깨기 때문입니다. 또한 학급을 열어 남용하거나 의도하지 않았던 방식으로 사용하게됩니다. 왜냐하면 그 정보를 다른 수업에 알려주기 때문입니다. .m 파일에 개인 범주를 선언하고 컴파일러가이 프로토콜을 구현하려는 의도를 알게되면 실제로 발생할 수있는 경고를 없앨 수있을뿐 아니라 사실상 코드 자체를 문서화하게됩니다.