默認規則
- 實例變量默認
@protected
- 類內部、子類可直接訪問;類外部不可直接訪問
- Objective-C 單繼承,無多重繼承
三種訪問修飾符
| 修飾符 | 類內部 | 子類 | 任意位置 |
@private | ✓ | ✗ | ✗ |
@protected | ✓ | ✓ | ✗ |
@public | ✓ | ✓ | ✓ |
完整示例:汽車繼承體系
基類 Car.h
#import
@interface Car : NSObject {
@protected // 顯式聲明默認權限
int carID;
float speed;
NSString *name;
}
- (void)run;
@end
Car.m
#import "Car.h"
@implementation Car
- (id)init {
if (self = [super init]) {
carID = 1000;
speed = 120;
name = @"小汽車";
}
return self;
}
- (void)run {
NSLog(@"start ...");
}
@end
子類 BMW.h
#import "Car.h"
@interface BMW : Car
@end
BMW.m —— 子類直接訪問 @protected 成員
#import "BMW.h"
@implementation BMW
- (void)run {
name = @"寶馬"; // 合法:子類可訪問父類 @protected 變量
NSLog(@"car name is %@", name);
}
@end
main.m
#import
#import "Car.h"
#import "BMW.h"
int main() {
@autoreleasepool {
Car *car = [[Car alloc] init];
[car run]; // 輸出: start ...
BMW *bmw = [[BMW alloc] init];
[bmw run]; // 輸出: car name is 寶馬
}
return 0;
}
關鍵點總結
@protected 是實例變量默認權限,平衡封裝與繼承復用
@private 強封裝,子類不可見,需通過屬性/方法間接訪問
@public 破壞封裝,極少使用,僅用於極致性能或 C 互操作
- 現代 Objective-C 推薦使用 @property 替代直接訪問實例變量,由編譯器自動合成存儲與存取方法
- 方法(實例/類方法)無訪問修飾符,均為公有;私有方法慣例以下劃線前綴或放在 class extension 中
最佳實踐
// 推薦:使用屬性封裝
@interface Car : NSObject
@property (nonatomic, assign) int carID;
@property (nonatomic, assign) float speed;
@property (nonatomic, copy) NSString *name;
- (void)run;
@end
// 子類通過 self.name 訪問,編譯期可檢查,支持 KVO、原子性等特性