2012-10-02 4 views
0

나는 주제에 관한 책과 함께 Objective-C 세계에서 저의 첫 걸음을 딛고 있습니다. 이제는 사용자 지정 클래스를 만들고 사용하는 개념을 내재화하는 단계로 넘어갔습니다.마술사와 커스텀 클래스 - 헤더와 구현 파일 이해하기

그리고이 기본 개념과 원리를 올바르게 이해하는 것이 내 미래의 Objective-C 학습의 열쇠라고 생각합니다. 개념을 다소 정확하게 파악했는지 확인하고 싶습니다.

그래서 사용자 지정 클래스를 만들 때이 작업은 공용 클래스 헤더 파일과 클래스 구현 파일이라는 두 개의 개별 파일에서 수행된다는 것을 이해했습니다. 그리고이 개념을 내면화하기 위해서, 나는 관객 앞에서 그 마술을하는 "마술사"와 평행을 이룬 것을 은유 적으로 이해했습니다.

헤더 파일은 마술사가 수행하는 극장 외부의 포스터와 다소 비슷합니다. 들어 오기 전에 우리는 마술사가 어떻게 보이는지 (속성), 그가 무엇을 트릭하는지 (대부분 "he") 수행 할 수 있는지 (메서드), 그리고 어떤 종류의 물건에 자신의 마술 트릭을 만들 수 있는지). 따라서 마술사의이 "공개"포스터 (헤더 파일)에서 나는 그가 수행 할 수있는 마술의 종류와 그가 사용하고있는 소품을 이해할 수 있습니다. 어쩌면이 특별한 마술사가 위대한 후디니 (계급 유산과 후디니가 수퍼 클래스이기 때문에)로부터 그의 트릭을 배웠다는 언급도있을 것입니다.

내가 무대 뒤에서 허락한다면, 나는 그가 실제로 그의 트릭을 어떻게하는지 볼 수있을 것이다. 즉, 나는 마술사 구현 파일을 볼 수있을 것이다.

이 은유는 사용자 정의 클래스의 개념을 이해하는 방법에 따라 다소 다를 수 있습니까?

그러나 클래스 메서드 및 인스턴스 메서드의 개념이이 메타포와 어떤 관련이 있는지 아직 알지 못합니다.

인스턴스 메소드가이 특정 쇼에서 마술사의 특정 "인스턴스"가 수행하는 트릭 범주에 속한다고 말하면 좋겠습니까? 클래스 메소드는 현대 마술사가 수행 할 수있는 트릭이 될 수 있습니까? 셋째, 메소드가 "유형"을 사용하는 방식을 다소 혼란스럽게합니다. 일부는 인터페이스 파일에서 앞에 선언 된 것처럼 보이고 일부는 메서드 내에서 즉시 "선언 된"것처럼 보입니다.

@interface Magician : NSHoudini 

// Instance method that given a variable of type rat it will turn this into something of type rabit 

- (rabit) FromRatToRabit: (rat) aRat; 

@end 

를 그리고 구현 파일은 다음과 같습니다 :

는 "마술사"클래스를 사용하는 예제를 이용하려면, 헤더 파일에 대한 이해는 다음과 같을 수

#import “Magician.h” 

@implementation Magician 

rabit aRabit 
// rabit being the type and aRabit the variable 


- (rabit) FromRatToRabit:(rat)aRat; 
{ 

// some magic code goes here which will take what’s in the aRat variable, of type rat 
// and turn it into a form of type rabit and return it in the aRabit variable 

aRabit 
} 
@end 

하는 경우 위의 올바른 나는 왜 당신이 "피드"메서드를 선언하지 않은 aRat 변수를 궁금해? 또는 선언을 메서드 설명에서 사용할 때 완료로 간주합니까?

답변

0

공용 인터페이스와 숨겨진 구현 간의 구분을 이해하는 데 큰 은유입니다. 그러나 당신이 그것에 약간 감싸고 있을지도 모른다고 생각합니다. 그리고 나는 두 가지 주요 오해를 봅니다. "Houdini"는 수퍼 클래스이고 클래스 방법은 "모든 트릭"입니다.

상속 계층의 감각을 평가하는 일반적인 교과서 방법은 하위 클래스 인스턴스가 "수퍼 클래스 인스턴스"인지 여부를 평가하는 것입니다.이것은 현실적으로 매우 추상적이 될 수 있지만 마술사 길드 의료 보험 혜택 처리 소프트웨어 또는 그 어떤 것을 디자인하고 있다면 마술사는 "후디니가 아닌"마술사입니다. 그들은 모든 프리랜서이기 때문에 모든 마술사는 "1099 계약자 (자영업 소득을위한 미국 세금 양식) 또는 이와 비슷한 것을 말합니다. 마술사를 "무대 출연자"라고 생각하는 또 다른 방법은 "연예인"입니다. 당신이 항상 이런 소프트웨어를 만들고 싶지는 않지만 내가 생각하는 개념을 배우는데 도움이 될 수 있습니다.

당신이 어려움을 겪고 있다고 말한 두 번째 것은 클래스 방법에 대해 생각하는 방법이었습니다. 유형에 고유하며 모든 인스턴스와 독립적 인 클래스 메소드 동작 및 정보를 고려하십시오. 혜택 소프트웨어 예제로 돌아가서, 마술사 길드원 모두가 봉급 당 $ X로 정의 된 기부금으로 401k (다른 미국 세금 코드, 은퇴 계좌)를 받았다고 말할 수 있습니다. 연공 서열에 따라 다르다는 것을 가정한다면, 이것은 수업 수준에서 계속 유지하는 좋은 정보 일 것입니다. 마술사가 수행 할 수있는 모든 트릭은 클래스 메소드가 아닙니다. 마술사가이를 수행하므로 인스턴스 메소드가됩니다. 아마도 (너무 위험한) 금지 된 트릭 목록은 계급 방법 일 수 있습니다. 이것은 마술사가되는 데 내재 된 규칙이지만 단일 마술사와는 독립적입니다.

마지막으로, 유형에 관한 세 번째 질문에 대해서는 사용자가 묻는 것을 일별 할 수 있지만 확실하지는 않습니다. 방법이 있다고 가정 해 보겠습니다.

- (void)myMethod:(id)myArgument 
{ 
    NSLog(@"myArgument = %@",myArgument); 
} 

그런 다음 myArgument이 신고됩니까? 메서드 시그니처에서 메서드의 매개 변수 인 곳에서 선언되며 메서드 본문의 범위 (중괄호 내)에서 참조 할 수 있습니다. 그게 당신이 "날아 다니는 것"에 의한 것인지 아닌지 확실하지 않습니다. 의사 코드가 아닌 실제 소스 코드를 제공하고 궁금한 부분을 지적해야합니다.

용어에 대한 몇 가지 사소한 점이 있습니다. 유감스럽게 생각하면 너무 오래 걸립니다. 메소드에 값을 "공급"하는 용어는 일반적으로 "매개 변수"또는 "인수"로 "전달"됩니다. 메서드 "설명"은 대개 메서드 시그니처 또는 선언이라고도하며 때로는 프로토 타입이라고도합니다. 그리고 네, 타입, 타입 선언 등으로 여러분이 이야기하는 것을 분명히 해주십시오. 여러분의 질문에 100 % 명확하지 않습니다.

희망이 도움이됩니다.

+0

대단히 감사합니다. Carl, 그런 길이로 설명해 주셨습니다! 그리고 예, 저는 은유가 개념을 이해하려고 할 때 위험한 물건이라는 것에 동의합니다. 그러나 당신이 위에 쥐었던 개조를 통해 나는 아직도 그것을 어떻게 든 사용할 수 있다고 생각합니다. Dima가 지적했듯이, 수퍼 클래스 인 Houdini의 선택은별로 잘 생각지 않았습니다. – DAWO

+0

도움이 되었기 때문에 기쁩니다. –

2

은유가 허용됩니다. 헤더는 다른 파일이 볼 수있는 인터페이스로, 해당 클래스/파일과 해당 구현 파일 (해당 파일이있는 경우)에서 액세스 할 수있는 대상을 알려줍니다.

마술사는 하위 클래스이지만 코드에 나타났습니다. 후디니. 나는 그저 당신의 예를 오해하고있을 지 모르지만, 상속의 관점에서, 그것은 아마 부정확하다. 당신이 말하는 것은 모든 마술사가 후디니의 한 종류라는 것입니다. 후디니가 일종의 마술사라고 말하는 것은 아마도 반대가되어야합니다.

클래스 대 인스턴스는 여러 번 설명되었으며 목표 C에만 국한되지 않으므로 너무 많이 사용하지 않을 것입니다. Here is a post with some good answers. 기본적으로 클래스 함수/변수는 클래스 자체에 속하며 해당 클래스의 인스턴스에만 해당되지는 않습니다. 클래스 함수/변수에 대한 또 다른 단어는 static 함수 또는 변수입니다.

마지막 질문의 의미가 확실하지 않습니다. 객관적인 c의 모든 포인터/변수에는 유형이 있습니다. 귀하의 구문은하지만 엉망이되고, 여기에 코드가 아마 같아야 게시 (그래 나는 토끼 - P의 철자 수정)

@interface Houdini : Magician 

// Instance method that given a variable of type rat it will turn this into something of type rabit 

- (Rabbit *) FromRatToRabit: (Rat *) aRat; 

@end 

#import “Houdini.h” 

@implementation Houdini 

Rabbit *aRabbit; // this is an ivar, although you're not actually using it anywhere, I'm just correcting your syntax 


- (Rabbit *) fromRatToRabit:(Rat *)aRat; 
{ 

// some magic code goes here which will take what’s in the aRat variable, of type rat 
// and turn it into a form of type rabit and return it in the aRabit variable 

    [aRat doSomethingToReturnRabbit]; // assuming rat has an instance function that returns a rabbit 
} 
@end 

그리고 당신을 것입니다

Houdini *myHoudini = [[Houdini alloc] init]; 
Rat *houdinisRat = [[Rat alloc] init]; 
Rabbit *houdinisRabbit = [myHoudini fromRatToRabbit:houdinisRat]; 

이 기능은 다음과 같은 방법으로 사용할 수 있습니다. 이것은 래트 클래스와 랍스터 그것은 당신이 제공하지 않은 클래스입니다. 나는 또한 보통 기본 초기화 프로그램을 사용하고있다.

도움이 될만한 자료가 많기 때문에이 정보가 도움이되기를 바랍니다. 개별적으로 질문하는 특정 주제에 대해 더 자세히 검색해보십시오.

+0

감사의 디마! 그렇습니다. "후디니"는 은유가 조금 잘못되었으므로, 이제 알 수 있습니다. – DAWO