Objective-C繼承


物件導向程式設計中最重要的概念之一是繼承。繼承允許根據一個類定義另一個類,這樣可以更容易地建立和維護一個應用程式。 這也提供了重用程式碼功能和快速實現時間的機會。

在建立類時,程式員可以指定新類應該繼承現有類的成員,而不是編寫全新的資料成員和成員函式。 此現有類稱為基礎類別,新類稱為派生類。

繼承的想法實現了這種關係。 例如,哺乳動物是一個種類的動物,狗是一種哺乳動物,因此狗是一個動物等等。

1. 基礎和派生類

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(@"姓名: %@", personName);
   NSLog(@"年齡: %ld", personAge);
   NSLog(@"文化: %@", employeeEducation);
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   NSLog(@"基礎類別Person物件");
   Person *person = [[Person alloc]initWithName:@"Maxsu" andAge:25];
   [person print];
   NSLog(@"繼承類Employee物件");
   Employee *employee = [[Employee alloc]initWithName:@"Yii bai" 
   andAge:26 andEducation:@"MBA"];
   [employee print];        
   [pool drain];
   return 0;
}

執行上面範例程式碼,得到以下結果:

2018-11-16 01:51:21.279 main[138079] 基礎類別Person物件
2018-11-16 01:51:21.280 main[138079] Name: Maxsu
2018-11-16 01:51:21.281 main[138079] Age: 25
2018-11-16 01:51:21.281 main[138079] 繼承類Employee物件
2018-11-16 01:51:21.281 main[138079] 姓名: Yii bai
2018-11-16 01:51:21.281 main[138079] 年齡: 26
2018-11-16 01:51:21.281 main[138079] 文化: MBA

2. 存取控制和繼承

如果派生類在介面類中定義,則它可以存取其基礎類別的所有私有成員,但它不能存取在實現檔案中定義的私有成員。

可以通過以下方式存取它們來執行不同的存取型別。派生類繼承所有基礎類別方法和變數,但以下情況除外 -

  • 無法存取在擴充套件幫助下在實現檔案中宣告的變數。
  • 無法存取在擴充套件幫助下在實現檔案中宣告的方法。
  • 如果繼承的類在基礎類別中實現該方法,則執行繼承類中的方法。