2009-11-02 2 views
1

나는 추상적 인 수업을 준비하고 있습니다. 이는 누군가가 서브 클래스를 작성할 때 몇 가지 메소드를 겹쳐 써야한다는 것을 의미합니다.서브 클래스로 덮어 쓰려고 할 때 .h에서 메소드를 선언하는 것이 좋은 스타일입니까?

그러나 다른 한편으로는 이러한 메서드는 추상 클래스 (하위 클래스의 수퍼 클래스)를 제외한 다른 곳에서 수동으로 호출 할 수 없습니다.

반드시 이러한 메소드를 .h로 선언해야하며, ".foo 및 -bar를 덮어 써야합니다."라는 .h에 주석을 추가 할 수 있습니까? 아니면 추상적 인 방법을 만드는 더 좋은 패턴이 있습니까?

+0

'신고'와 '정의'를 구분하고 있습니까? 하위 클래스가 기본 클래스에서이를 재정의 할 수 있도록 선언해야합니다. 헤더에 정의하지 않기로 결정할 수 있습니다. –

+0

사실이지만 여전히 하위 클래스가해야 할 일을 문서화하고 싶습니다. 나는 보통 질문에 대답하기 때문에 완벽한 해결책은 아니지만 "Subclassing"과 같은 제목의 주석이있는 머리글에 섹션이 있습니다. 누구나 여전히 그것을 호출 할 수 있습니다 ... –

+0

"덮어 쓰지"않고 "덮어 쓴" . 서브 클래스의 메소드를 오버라이드 (override)하면, 슈퍼 클래스의 구현이 그대로 존재합니다. – NSResponder

답변

3

가능한 경우 부적절한 구현이 컴파일되지 않도록 코드를 작성하십시오. 그렇게 할 수 없다면 서브 클래스가 올바르게 작성되지 않은 경우 런타임 오류 (최소한 디버그 빌드에서)를 생성해야합니다. 사람들이 읽을 수 없기 때문에 주석에 의존하지 마십시오.

5

관련 : Is there a way to create an abstract class in Objective C?

오브젝티브 C는 실제로 추상 같은 클래스를 선언 할 수있는 방법이 없습니다. Apple's Docs에서 :

추상 클래스

일부 클래스는 설계 전용 또는 주로 그들로부터 다른 클래스가 할 수 상속 있도록. 이러한 추상적 인 클래스 그룹 메소드와 인스턴스 은 다른 숫자로 공통의 정의로 사용될 수 있습니다. 추상 클래스는 일반적으로 자체적으로 불완전한 이지만, 에는 서브 클래스의 구현 부담을 줄이는 유용한 코드가 들어 있습니다. (추상 클래스이기 때문에 들이 때로는 추상적 인 슈퍼 클래스라고하고 , 유용하게 서브 클래스가 있어야합니다.) 다른 언어와는 달리

을 오브젝티브 C는 추상적으로 마크 클래스 구문을 가지고도하지 않는다 을 사용하면 추상 클래스 인 인스턴스를 만들 수 없습니다.

NSObject 클래스는 코코아에서 추상 클래스의 표준 예제입니다. 응용 프로그램에서 NSObject 클래스의 인스턴스를 사용하지 마십시오. 은 아무 것도 좋지 않습니다. 은 특별히 아무것도하지 않는 기능이있는 일반 개체입니다.

NSView의 클래스는, 다른 한편으로는, 는 가끔 직접 사용할 수있는 추상 클래스 인스턴스의 예를 제공합니다.

추상 클래스에는 응용 프로그램의 구조를 정의하는 데 도움이되는 코드 이 포함되어있는 경우가 많습니다. 이 클래스의 하위 클래스 인 을 새로 만들면 응용 프로그램 구조에 의 새 클래스가 쉽게 적용되고 이 다른 객체와 함께 자동으로 작동합니다.

그래서 귀하의 질문에 대답하기 위해, 그래, 당신은 헤더의 방법 서명을 배치해야하고,이 관련 질문의 대답 상태처럼,라고하면 오류가 발생하도록 기본 클래스의 메서드를 구현해야합니다.

protocol을 사용하여 클래스가 특정 방법을 구현하도록 할 수도 있습니다.

그러나 기본 클래스를 구현하도록 선택했지만 문서에서 정확하게 클래스를 가정하고 정확히 하위 클래스로 분류하는 방법에 대해 명확하게 문서화하십시오.

1

다른 사람들이 말한 것처럼 Objective-C는 순수 가상 클래스를 지원하지 않습니다.

런타임시 순수 가상 동작을 적용 할 수 있습니다. 이 작업을 수행하는 가장 깨끗한 방법은 사용하는 것입니다 오브젝티브 C 런타임의 _cmd와 NSObject의의 -doesNotRecognizeSelector:

- (void)iMustBeImplementedInaSubclass; 
{ 
    [self doesNotRecognizeSelector:_cmd]; // Pure virtual 
} 

벤 당신은 아마 더 나은 API 디자인 권리를 얻을 수있는 프로토콜을 사용하여 제공됩니다 말했듯이.

2

"보호 된"및 "추상"메서드는 헤더 파일에 선언해야하지만 별도의 범주를 사용하여 목적과 용도를 명확하게 나타낼 수 있습니다.

@interface MyBaseClass : NSObject { 
} 
- (void)foo; 
@end 

@interface MyBaseClass(ProtectedMethods) 
- (void)bar; 
@end 

@interface MyBaseClass(AbstractMethods) // Subclasses must implement 
- (void)internalBar; 
@end 

당신은 하나의 헤더에 모든 것을 넣을 수 있습니다, 또는 별도의 "보호"헤더에 보호 추상적 인 선언을 넣을 수, 서브 클래스의 구현 만이 포함되어야 의미 MyClassProtected.h을 말한다. 그것은 당신의 보호 된 방법을 "숨기"를 얼마나 나쁜지에 달려 있습니다.

기본/순수 가상 메서드가 호출 될 때 기본 클래스가 기록, 어설 션 또는 스로우 할 수 있습니다.

관련 문제