Objective C 대상 에 대한 초보 적 익숙 함
7200 단어 objective c
간접 적 이해
프로 그래 밍 계 에 서 는 "간접 층 을 하나 더 추가 해 야 컴퓨터 과학 이 해결 할 수 없 는 문제 가 없다" 는 말 이 있다.사실 간접 적 으로 간단 하 다. 코드 에서 어떤 값 을 직접 사용 하지 않 고 이 값 을 가리 키 는 지침 을 사용 한 다 는 것 이다.
생활 속 의 예: 당신 은 KFC 의 전화 번 호 를 모 를 수 있 지만 인터넷 을 통 해 KFC 의 전화 번 호 를 찾 을 수 있 습 니 다. 인터넷 으로 찾 는 것 은 실제 적 으로 간접 적 인 방식 입 니 다.
간접 적 으로 프로그램 에 여러 가지 표현 방식 이 있 는데 예 를 들 어 변수 식 의 간접, 파일 식 간접, 매개 변수 식 간접 등 이다.
2. OOP 세계 에서 의 간접 사용
사실 OOP 의 진정한 혁명적 인 것 은 호출 코드 에서 간접 적 으로 사용 하 는 것 이다.
우선 OOP 의 사상 을 쉽게 이해 할 수 있 도록 프로 세 스 프로 그래 밍 의 예 를 들 어 보 겠 습 니 다.
#import <Foundation/Foundation.h>
typedef enum{
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
typedef enum{
kRedColor,
kGreenColor,
kBlueColor
} ShapeColor;
typedef struct{
int x, y, width, height;
} ShapeRect;
typedef struct{
ShapeType type;
ShapeColor fillColor;
ShapeRect bounds;
} Shape;
void drawShapes(Shape shapes[], int count){
int i;
for(i = 0; i < count; i++){
switch (shapes[i].type) {
case kCircle:
drawCircle(shapes[i].bounds, shapes[i].fillColor);
break;
case kRectangle:
drawRectang(shapes[i].bounds, shapes[i].fillColor);
break;
case kOblateSpheroid:
drawEgg(shapes[i].bounds, shapes[i].fillColor);
break;
default:
break;
}
}
}
void drawCircle(ShapeRect bounds, ShapeColor fillColor){
NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}
void drawRectang(ShapeRect bounds, ShapeColor fillColor){
NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}
void drawEgg(ShapeRect bounds, ShapeColor fillColor){
NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}
NSString *colorName(ShapeColor colorName){
switch(colorName){
case kRedColor :
return @"red";
break;
case kGreenColor :
return @"green";
break;
case kBlueColor:
return @"blue";
break;
}
return @"no clue";
}
int main(int argc, const char * argv[]){
Shape shapes[3];
ShapeRect rect0 = {0, 0, 10, 30};
shapes[0].type = kCircle;
shapes[0].fillColor = kRedColor;
shapes[0].bounds = rect0;
ShapeRect rect1 = {30, 40, 50, 600};
shapes[1].type = kCircle;
shapes[1].fillColor = kRectangle;
shapes[1].bounds = rect1;
ShapeRect rect2 = {15, 18, 37, 29};
shapes[2].type = kOblateSpheroid;
shapes[2].fillColor = kBlueColor;
shapes[2].bounds = rect2;
drawShapes(shapes, 3);
return (0);
}
위의 코드 회색 은 항상 간단명료 하지만, 한 가지 문 제 는 프로그램의 확장 과 유지 보수 가 매우 어려워 진 다 는 것 이다. 만약 우리 가 한 가지 유형 을 더 추가 하면, 프로젝트 에서 적어도 4 개의 서로 다른 위치 에서 프로그램 을 수정 해야만 이 임 무 를 완성 할 수 있다.
다음 에 말 한 OOP 는 이러한 문 제 를 완벽 하 게 해결 했다. 이 는 데이터 중심, 함 수 를 데이터 서비스 로 한다.
void drawShapes(id shapes[], int count){
int i;
for(i = 0; i < count; i++){
id shape = shapes[i];
[shape draw];
}
}
위의 코드 는 많은 학생 들 이 이상 하 게 느 낄 수 있 습 니 다. 일반적으로 괄호 는 C 언어 에서 배열 을 대표 합 니 다. Objective C 에서 괄호 는 다른 뜻 도 있 습 니 다. 그들 은 특정한 대상 에 게 무엇 을 해 야 하 는 지 알려 줍 니 다.괄호 안에 있 는 첫 번 째 항목 은 대상 이 고, 나머지 부분 은 대상 이 실행 해 야 할 작업 입 니 다.이 예 에서, 우 리 는 shape 라 는 대상 에 게 draw 작업 을 수행 하 라 고 통지 합 니 다.만약 shape 가 원형 이 라면 우 리 는 원형 을 얻 을 수 있다.만약 shape 가 직사각형 이 라면, 우 리 는 직사각형 까지 갈 것 이다.
Objective - C 에서 대상 에 게 어떤 조작 을 수행 하 라 고 알 리 는 것 을 '메시지 보 내기' 또는 '호출 방법' 이 라 고 합 니 다.코드 에서 [shape draw] 는 shape 대상 이 draw 메 시 지 를 보 내 는 것 을 표시 합 니 다.
또 하나의 이상 한 점 은 id 입 니 다. id 는 일종 의 범 형 으로 모든 종류의 대상 을 표시 하 는 데 사 용 됩 니 다.실제 id 는 하나의 지침 으로 그 중의 어떤 구 조 를 가리킨다.
3. 대상 을 대상 으로 하 는 예
다음은 CirCle 인터페이스의 성명 입 니 다.
@interface Circle : NSObject{
ShapeColor fillColor;
ShapeRect bounds;
}
- (void) setFillColor : (ShapeColor) fillColor;
- (void) setBounds : (ShapeRect) bounds;
- (void) draw;
@end
@interface "컴 파일 러 에 게 objective C 의 성명 인터페이스 라 고 알려 줍 니 다."
Circle 대상 에 필요 한 다양한 데이터 구성원:
{
ShapeColor fillColor;
ShapeRect bounds;
}
- (void) setBounds: (ShapeRect) bounds;
기발 한 objective, 방법 성명 앞 에 '-' 를 더 추가 합 니 다. 짧 은 선 뒤 에는 방법의 반환 유형 으로 괄호 안에 있 습 니 다. 이 어 뒤의 당신들 은 모두 알 고 있 습 니 다. 바로 매개 변수의 성명 입 니 다.
Circle 구현 코드:
@implementation Circle
-(void) setFillColor : (ShapeColor) c
{
fillColor =c;
}
-(void) setBounds : (ShapeRect) b
{
bounds = b;
}
-(void) draw
{
NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}
@end
성명 인터페이스 와 마찬가지 로 실 현 된 것 도 @ implementation 으로 시작 하고 끝 에 @ end 를 사용 해 야 합 니 다.
실제로 objectvie - c 에서 호출 하 는 방법 은 self 라 는 비밀 숨겨 진 매개 변수 가 수신 대상 에 게 전달 되 는 것 입 니 다.
위의 예 에서 fillColor = c 는 self - > fillCOlor = c 로 쓸 수 있 습 니 다.
다음 마지막 실례 화 대상
대상 을 예화 할 때 메모 리 를 할당 해 야 합 니 다. 그리고 이 메모리 들 은 초기 화 되 어 유용 한 기본 값 을 저장 합 니 다.
int main(int argc, const char * argv[]){
id shapes[3];
ShapeRect rect0 = {0, 0, 10, 30};
shapes[0] = [Circle new];
[shapes[0] setBounds : rect0];
[shapes[0] setFillColor : kRedColor];
ShapeRect rect1 = {30, 40, 50, 60};
shapes[1] = [Rectangle new];
[shapes[1] setBounds: rect1];
[shapes[1] setFillColor: kGreenColor];
ShapeRect rect2 = {15, 19, 37, 29};
shapes[2] = [OblateShereoid new];
[shapes[2] setBounds : rect2];
[shapes[2] setFillCOlor : kBlueColor];
drawShapes(shapes, 3);
return (0);
}
보아하니 oop 예 에서 main 방법 은 과정 화 된 예 의 main 과 약간 비슷 하 다. oop 예 에는 shapes 배열 이 아 닌 id 배열 이 포함 되 어 있 으 며 대상 을 만 들 때 new 메 시 지 를 보 내야 한다.
만약 우리 가 프로그램 에 한 가지 유형 을 더 추가 하면 인 터 페 이 스 를 실현 하기 만 하면 확장 할 수 있다.
@implementation Triangle
-(void) setFillColor : (ShapeColor) c
{
fillColor =c;
}
-(void) setBounds : (ShapeRect) b
{
bounds = b;
}
-(void) draw
{
NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}
요약:
프로 세 스 프로 그래 밍: 함수 1 위, 데이터 2 위
대상 지향 프로 그래 밍: 데이터 1, 함수 2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Objective C 배열 의 메모리 관리텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.