首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 訪問控制詳解:實例變量作用域、@protected/@private/@public、繼承可見性

     編輯:關於C語言

默認規則

  • 實例變量默認 @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;
}

關鍵點總結

  1. @protected 是實例變量默認權限,平衡封裝與繼承復用
  2. @private 強封裝,子類不可見,需通過屬性/方法間接訪問
  3. @public 破壞封裝,極少使用,僅用於極致性能或 C 互操作
  4. 現代 Objective-C 推薦使用 @property 替代直接訪問實例變量,由編譯器自動合成存儲與存取方法
  5. 方法(實例/類方法)無訪問修飾符,均為公有;私有方法慣例以下劃線前綴或放在 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、原子性等特性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved