繼承語法
@interface SubClass : SuperClass
// 新增成員、屬性、方法
@end
完整示例:ClassA → ClassB
ClassA.h(父類)
#import
@interface ClassA : NSObject {
int x; // 默認 @protected
}
- (void)initVar;
@end
ClassA.m
#import "ClassA.h"
@implementation ClassA
- (void)initVar {
x = 100;
}
@end
ClassB.h(子類)
#import "ClassA.h"
@interface ClassB : ClassA
- (void)printVar;
@end
ClassB.m —— 直接訪問父類 @protected 變量
#import "ClassB.h"
@implementation ClassB
- (void)printVar {
NSLog(@"x = %d", x); // 合法:子類可見父類 @protected 成員
}
@end
Main.m
#import
#import "ClassB.h"
int main() {
@autoreleasepool {
ClassB *b = [[ClassB alloc] init];
[b initVar]; // 調用繼承自父類的方法
[b printVar]; // 輸出: x = 100
}
return 0;
}
核心機制深度解析
1. 初始化鏈
- 子類
init 必須調用 [super init]
- 父類初始化完成後,子類再初始化自身成員
- 指定初始化器模式:子類覆寫父類指定初始化器,並調用
[super init...]
2. 方法重寫與多態
// 父類
- (void)run { NSLog(@"Car run"); }
// 子類重寫
- (void)run {
[super run]; // 可選:調用父類實現
NSLog(@"BMW run faster");
}
// 多態調用
Car *c = [[BMW alloc] init];
[c run]; // 動態綁定 → 輸出 BMW 版本
3. 實例變量可見性