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

Objective-C 類繼承機制詳解:語法、初始化鏈、方法重寫、多態調用

     編輯:關於C語言

繼承語法


@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. 實例變量可見性

4. 構造/析構順序

  1. alloc:分配整個對象內存(含父類成員)
  2. init:父類 → 子類 初始化
  3. dealloc:子類 → 父類 清理(ARC 自動管理)

現代最佳實踐

  1. 使用 @property 替代實例變量:自動合成存儲、存取方法、支持特性修飾
  2. 設計指定初始化器:文檔標註、子類必須覆寫並調用 super
  3. 避免深層繼承:組合優於繼承,協議+擴展實現多態復用
  4. 標註 NS_DESIGNATED_INITIALIZER:編譯器檢查初始化鏈完整性

圖示:繼承關係

ClassA-ClassB 繼承關係圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
父類聲明子類直接訪問外部直接訪問
@private✗✗
@protected (默認)✓✗
@public✓✓