Objective-C----繼承

來源:互聯網
上載者:User

標籤:objective   代碼   繼承   objective-c   

一、概念:

物件導向提供了繼承文法,能大大簡化代碼。把公用的方法和執行個體變數寫在父類裡,子類字需要寫自己專屬的執行個體變數和方法即可。

繼承既能保證類的完整,又能簡化代碼。

二、繼承的特點:

OC 中只允許單繼承。
沒有父類的類成為根類,OC中的根類是NSObject(祖宗)。
繼承的內容:所有執行個體變數和方法。
如果子類不滿意父類方法的實現,可以重寫(overwrite)父類的方法。

三、方法調度機制:

當代碼發送訊息時,Objective-C的方法調度機制將在當前的類中搜尋相應的方法。如果無法在接收訊息的對象的類檔案中找到相應的方法,它就會在該對象的超類中進行尋找。

每個方法調用都獲得了一個名為 self 的隱藏參數,它是一個指向接收訊息的對象的指標。這些方法通過 self 參數來尋找它們需要用到的執行個體變數。

super ,既不是參數也不是執行個體變數,而是由 Objective-C 向該類的超類發送訊息。如果超類中沒有定義改訊息,Objective-C會和平常一樣繼續在繼承鏈上一級中尋找。一直尋找到根類。

四、什麼情況下用複合?什麼情況下用繼承?

繼承的類之間建立的關係為“is a”(是一個)。三角形是一個形狀,V6 是一個發動機,米其林 是一種輪胎的名字。如果可以說“X 是一個 Y”,那就可以使用繼承。
另一方面,複合的類之間建立的關係為“has a”(有一個)。形狀有一個填充顏色,汽車有一個發動機和四個輪胎。與繼承不同,汽車不是一個發動機,也不是一個輪胎。如果可以說“X 有一個 Y”,那麼就可以使用複合。

五、直接上例代碼
#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]) {    // 一個類可以擁有多個子類,一個類只能擁有一個直接父類(單繼承的概念),但是可以擁有多個超類。    Student *student = [[Student alloc] initWithName:@"wang" gender:@"nv" age:31] ;    [student eat] ;    [student sleep] ;    Student *otherStudent = [[Student alloc] initWithName:@"zhen" gender:@"nan" age:12 number:11011 schoolName:@"hafu"] ;    [otherStudent study] ;    return 0;}

Student.h 檔案:

////  Student.h////  Created by  on 15/4/1.//  Copyright (c) 2015年 . All rights reserved.//#import "Person.h"// 定義子類是在父類繼承而來的特徵(執行個體變數)和行為(方法)的基礎上定義自己特有的特徵和行為@interface Student : Person{    int       _number ;    NSString *_schoolName ;}- (void)setNumber: (int)number ;- (void)setShoolName: (NSString *)schoolName ;- (int)number ;- (NSString *)schoolName ;- (instancetype)initWithName:(NSString *)name                      gender:(NSString *)gender                         age:(int)age                      number:(int)number                  schoolName:(NSString *)schoolName ;- (void)study ;@end // Student : Person

Student.m 檔案:

////  Student.m////  Created by  on 15/4/1.//  Copyright (c) 2015年 . All rights reserved.//#import "Student.h"@implementation Student- (void)setNumber:(int)number {    _number = number ;} // setNumber- (void)setShoolName:(NSString *)schoolName {    _schoolName = schoolName ;} // setSchoolName- (int)number {    return _number ;} // number- (NSString *)schoolName {    return _schoolName ;} // schoolName- (instancetype)initWithName:(NSString *)name                      gender:(NSString *)gender                         age:(int)age                      number:(int)number                  schoolName:(NSString *)schoolName {    if ( self = [super initWithName:name                             gender:gender                                age:age] ) {        _number = number ;        _schoolName = schoolName ;    }    return self ;} // initWithName- (void)study {    NSLog( @"%@在%@學校學習,學號:%d!",          _name, _schoolName, _number ) ;} // study- (void)eat {    [super eat] ;    NSLog( @"喝西北風" ) ;} // eat@end // Student : Person

Person.h 檔案:

////  Person.h////  Created by  on 15/4/1.//  Copyright (c) 2015年 . All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject{    NSString *_name ;    NSString *_gender ;    int       _age ;}//setter設定器- (void)setName: (NSString *)name ;- (void)setGender: (NSString *)gender ;- (void)setAge: (int)age ;//getter訪問器- (NSString *)name ;- (NSString *)gender ;- (int)age ;// 初始化- (instancetype)initWithName: (NSString *)name                      gender: (NSString *)gender                         age: (int)age ;- (void)eat ; // 吃- (void)sleep ; // 睡@end  //  Person

Person.m 檔案:

////  Person.m////  Created by  on 15/4/1.//  Copyright (c) 2015年 . All rights reserved.//#import "Person.h"@implementation Person- (void)setName:(NSString *)name {    _name = name ;} // setName- (void)setGender:(NSString *)gender {    _gender = gender ;} // setGender- (void)setAge:(int)age {    _age = age ;} // setAge- (NSString *)name {    return  _name ;} // getName- (NSString *)gender {    return _gender ;} // getGender- (int)age {    return _age ;} // getAge- (instancetype)initWithName:(NSString *)name                      gender:(NSString *)gender                         age:(int)age {    if ( self = [super init] ) {        _name = name ;        _gender = gender ;        _age = age ;    }    return self ;} // initWithName- (void)eat {    NSLog( @"%@在餐廳吃飯!", _name ) ;} // eat- (void)sleep {    NSLog( @"%@在睡覺!", _name ) ;} // sleep@end  //  Person

Objective-C----繼承

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.