Objective-C 繼承
在麵向對象的編程中最重要的概念之一是繼承。繼承允許我們定義一個類在另一個類,這使得它更容易創建和維護應用程序方麵。這也提供了一個機會,重用代碼的功能和快速的執行時間。
當創建一個類,而不是寫入新的數據成員和成員函數,程序員可以指定新的類繼承現有類的成員。這種現有的類稱為基類,新類稱為派生類。
繼承的想法實現是有關係的。例如,哺乳動物是一個動物,狗是哺乳動物,因此狗是動物等。
基類和派生類:
Objective-C中允許多重繼承,也就是說,它隻能有一個基類,但允許多層次的繼承。Objective-C中的所有類的超類為NSObject。
@interface derived-class: base-class
考慮一個基類 Shape 和它的派生類Rectangle 如下:
#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
訪問控製和繼承:
如果它在接口類中定義的派生類可以訪問基類的私有成員,但它不能訪問私有成員,在實現文件中定義。
根據誰可以訪問它們,以下列方式,我們可以總結不同的接入類型:
派生類繼承基類的方法和變量有以下例外:
-
擴展的幫助下,在實現文件與聲明的變量是無法訪問的。
-
擴展的幫助下實現文件中聲明的方法是無法訪問的。
-
在基類中繼承的類中實現該方法的情況下,則該方法在派生類中被執行。