Objective-C 상속

객체 지향 프로그래밍에서 가장 중요한 개념 중 하나는 상속입니다. 상속을 통해 다른 클래스의 관점에서 클래스를 정의 할 수 있으므로 응용 프로그램을 쉽게 만들고 유지 관리 할 수 ​​있습니다. 또한 코드 기능을 재사용 할 수있는 기회와 빠른 구현 시간을 제공합니다.

클래스를 만들 때 완전히 새로운 데이터 멤버와 멤버 함수를 작성하는 대신 프로그래머는 새 클래스가 기존 클래스의 멤버를 상속하도록 지정할 수 있습니다. 이 기존 클래스를base 클래스, 새 클래스는 derived 수업.

상속의 개념은 is a관계. 예를 들어, 포유류 IS-A 동물, 개 IS-A 포유류, 따라서 개 IS-A 동물도 마찬가지입니다.

기본 및 파생 클래스

Objective-C는 다중 수준 상속 만 허용합니다. 즉, 하나의 기본 클래스 만 가질 수 있지만 다중 수준 상속은 허용합니다. Objective-C의 모든 클래스는 수퍼 클래스에서 파생됩니다.NSObject.

@interface derived-class: base-class

기본 클래스 고려 Person 및 파생 클래스 Employee 다음과 같이-

#import <Foundation/Foundation.h>
 
@interface Person : NSObject {
   NSString *personName;
   NSInteger personAge;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;
- (void)print;

@end

@implementation Person

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
   personName = name;
   personAge = age;
   return self;
}

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
}

@end

@interface Employee : Person {
   NSString *employeeEducation;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
  andEducation:(NSString *)education;
- (void)print;
@end

@implementation Employee

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
   andEducation: (NSString *)education {
      personName = name;
      personAge = age;
      employeeEducation = education;
      return self;
   }

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
   NSLog(@"Education: %@", employeeEducation);
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   NSLog(@"Base class Person Object");
   Person *person = [[Person alloc]initWithName:@"Raj" andAge:5];
   [person print];
   NSLog(@"Inherited Class Employee Object");
   Employee *employee = [[Employee alloc]initWithName:@"Raj" 
   andAge:5 andEducation:@"MBA"];
   [employee print];        
   [pool drain];
   return 0;
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

2013-09-22 21:20:09.842 Inheritance[349:303] Base class Person Object
2013-09-22 21:20:09.844 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.844 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.845 Inheritance[349:303] Inherited Class Employee Object
2013-09-22 21:20:09.845 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.846 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.846 Inheritance[349:303] Education: MBA

액세스 제어 및 상속

파생 클래스는 인터페이스 클래스에 정의 된 경우 기본 클래스의 모든 전용 멤버에 액세스 할 수 있지만 구현 파일에 정의 된 전용 멤버에는 액세스 할 수 없습니다.

다음과 같은 방법으로 액세스 할 수있는 사람에 따라 다양한 액세스 유형을 요약 할 수 있습니다.

파생 클래스는 다음 예외를 제외하고 모든 기본 클래스 메서드와 변수를 상속합니다.

  • 확장의 도움으로 구현 파일에 선언 된 변수에 액세스 할 수 없습니다.

  • 확장의 도움으로 구현 파일에 선언 된 메서드에 액세스 할 수 없습니다.

  • 상속 된 클래스가 기본 클래스의 메서드를 구현하는 경우 파생 클래스의 메서드가 실행됩니다.