2012-08-27 5 views
4

나는 단지 목표를 배우려하고있다. c.Abstract objective-c의 팩토리 패턴

AbstractFactory 패턴의 위키피디아 예제를 다른 언어로 보았습니다. 공장 여기

@protocol Button 
- (void)paint; 
@end 

@interface WinButton : NSObject <Button> 
@end 

것 : 여기

이 버튼 정의의 지금까지 내가 kwnow로

@implementation WinFactory 
- (id)createButton { 
    return [[[WinButton alloc] init] autorelease]; 
} 
@end 

, OBJ-C의 id 키워드는 C#의이 var 또는 C++ (11)의 auto과 같이해야한다 , 맞습니까?

그래서 내 질문은 :

왜 공장이 지정되지 않은 유형의 일반 객체를 돌려 보자? 버튼이 아닌 다른 것을 공장에서 반환하도록하는 오류입니까? 아니면 그렇게할만한 이유가 있습니까? 나는 공장이 방법을 써서

:

@implementation WinFactory 
- (id<Button>)createButton { 
    return [[[WinButton alloc] init] autorelease]; 
} 
@end 

은 내가 잘못입니까?

답변

6

왜 지정되지 않은 유형의 일반 객체를 반환합니까? 그들은 지속적으로 (정말 추상 개체)를 입력하지 않기 때문에 당신이 id 반환 참조 많은 경우에

, 그것은, 또는 암시 적 업 캐스팅이 도입 된 것 때문이다.

이 오류 (공장에서 Button이 아닌 다른 것을 반환하도록 함)입니까, 아니면 그렇게해야 할 이유가 있습니까?

이것은 오류가 아닙니다. 물론 일치하지 않는 유형은 반환하지 말아야합니다.

나는 다음과 같이 공장을 작성한다. ... 나는 틀린가?

@implementation WinFactory 
- (id<Button>)createButton { 
    return [[[WinButton alloc] init] autorelease]; 
} 
@end 

이 시나리오의 큰 잡았다 ObjC 매우 느슨하게 입력했는지, 당신은 모든 선택기 '매개 변수를 확인하고 유형 일치 반환하기 위해 노력한다. 말하자면 모든 번역에있는 모든 createButton은 모두 동일한 유형을 반환하고 매개 변수에 대해 동일한 유형을 가져야합니다. 때로는 컴파일러의 모호성을 피하기 위해보다 설명적인 이름을 선택해야합니다. 이 NSString을 반환하는 경우, 다음 +[NSMutableString string]는 경고의 원인이 될 수있다 - +[NSString string] 반환 id 왜한다고

설명합니다. 이것은 컴파일러가 메서드 선언을 동적 인스턴스와 일치시키는 (불가능한) 어려운 시간을 가질 수 있기 때문입니다. 이는 메소드의 유형도 포함하는 편의 생성자 (예 : +[NSDictionary withObject:]과 반대로 +[NSDictionary dictionaryWithObject:])와 같이 셀렉터의 '단어'이름 지정을 이해하는 데 도움이 될 수 있습니다.- 만큼 당신이 그 일반적인 방법 서명 살 수 id<Button> 또는 NSObject<Button>* 또는 다른 자격 유형은 괜찮 : 귀하의 질문에 도착하는 그러나

. 컴파일러가 에 도움이되는 형식 자격을 도입했습니다.

+0

명확한 대답에 감사드립니다. 사실 실수가 아니 었습니다. 나는 신분증

+0

@Heisenbug 당신은 환영합니다 - 그 경우 구문 비트를 삭제하겠습니다. 건배 – justin

4

여기에 더 올바른 반환 형식은 다음과 같습니다

- (id<Button>)createButton; 

이 반환 유형이 <Button> 프로토콜을 준수하는 객체입니다 것을 의미한다. WP 페이지를 조금 더 명확하게 고칠 수 있습니다. <Button> 프로토콜은 완전성을 위해 (실제로 사용을 단순화하기 위해) <NSObject> 프로토콜을 상속해야합니다.

추상 팩토리 패턴은 ObjC에서 다소 특이합니다. UIKit 또는 Foundation에서 사용되는 경우를 생각하려고합니다. 클래스를 내부적으로 처리하는 것이 일반적입니다 (예 : NSNumber). 클래스 클러스터라고합니다.

ObjC에서 C++ 또는 C# 스타일로 코드를 작성하는 데 매우주의하십시오. ObjC는 정적 언어가 아니며 사용 된 패턴은 종종 매우 다릅니다. (나는 AF가 정적 인 패턴이라고 말하지 않고있다. 을 ObjC에서 아주 잘 사용할 수있다. 나는 ObjC를 배우려고 시도하는 동안 그것을보고 있다는 사실이 당신이 접근하고 있다는 것을 의미한다고 말하고있다. ObjC에서 어떻게 개발할 것인가를 배우기보다는 "ObjC에서 어떻게 C++을 할 것인가"를 배울 수 있습니다.)

+0

당신은 obj-c에서 좋은 프로그래밍 실습과 패턴을 배우기 위해 저에게 제안 할 책이나 강연이 있습니까? – Heisenbug

+0

스탠포드 코스는 잘 검토되어 있습니다 (cs193p.stanford.edu). Jeff LaMarche의 저술에 대한 존경심이 너무 많습니다 (http://www.amazon.com/Beginning-iOS-Development-Exploring-SDK/dp/1430236051). –

+0

*

0

Objective-C는 추상 팩터 리인 클래스 클러스터의 개념을 가지고 있습니다. See this answer.