標籤: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----繼承