- 不要等到明天,明天太遙遠(yuǎn),今天就行動(dòng)。
須讀:看完該文章你能做什么?
知道繼承的特性(調(diào)用方法順序)
學(xué)習(xí)前:你必須會(huì)什么?(在這里我已經(jīng)默認(rèn)你具備C語(yǔ)言的基礎(chǔ)了)
什么是繼承
注:(小白直接上手)
一、本章筆記
一.
如果子類(lèi)中 有父類(lèi)中同名的方法,那么我們稱之為方法重寫(xiě)
注意: 繼承中的方法調(diào)用順序, 如果自己有 就調(diào)用自己的,如果自己沒(méi)有調(diào)用父類(lèi)的
**方法的調(diào)用順序, 先自己再父類(lèi), 如果父類(lèi)中沒(méi)有 再找爺爺類(lèi),如果爺爺類(lèi)再?zèng)]有 就找 爺爺?shù)陌职诸?lèi)
如果一直找到 NSObject類(lèi)沒(méi)有找到, 那么就會(huì)報(bào)錯(cuò)
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[IPhone signalWithNumber:]: unrecognized selector sent to instance 0x1002000b0'
二.
在繼承中除了 對(duì)象方法可以重寫(xiě),類(lèi)方法也可以重寫(xiě)
三.
注意 : 在繼承中方法可以重寫(xiě),但是屬性(成員變量)不能重寫(xiě)
四.
繼承:
當(dāng)B類(lèi) 繼承 A類(lèi), 那么B類(lèi) 就擁有 A類(lèi)所有的屬性和方法(類(lèi)方法/對(duì)象方法)
優(yōu)點(diǎn):
提高代碼的復(fù)用性(重復(fù)的代碼)
可以讓類(lèi)與類(lèi)之間產(chǎn)生關(guān)系,正是因?yàn)? 繼承讓類(lèi)與類(lèi)之間 產(chǎn)生了關(guān)系 所以才有了多態(tài)
缺點(diǎn):
耦合性太強(qiáng)(依賴性太強(qiáng)) 也就是說(shuō) 比如有一天我的Phone類(lèi)刪掉了,那么其他的子類(lèi)就不能使用了
注意:
不要以為繼承可以提高代碼的復(fù)用性, 以后但凡發(fā)現(xiàn)多個(gè)類(lèi)當(dāng)中 有重復(fù)代碼 就抽取一個(gè)父類(lèi)
只有滿足一定的條件 才能使用繼承
條件 : xxx 是 xxx / 某某某 is a 某某某
學(xué)生 :
姓名
年齡
數(shù)學(xué)成績(jī)
語(yǔ)文成績(jī)
英語(yǔ)成績(jī)
排行榜:
數(shù)學(xué)成績(jī)
語(yǔ)文成績(jī)
英語(yǔ)成績(jī)
分?jǐn)?shù)類(lèi):
數(shù)學(xué)成績(jī)
語(yǔ)文成績(jī)
英語(yǔ)成績(jī)
二、code
main.m
#pragma mark 09-繼承其它特性
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類(lèi)
#import "IPhone.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
IPhone *p = [IPhone new];
[p signalWithNumber:@"10010"];
[IPhone brand];
return 0;
}
Phone
>>>.h
#import <Foundation/Foundation.h>
@interface Phone : NSObject
{
int _cpu;
}
// 打電話
- (void)signalWithNumber:(NSString *)number;
// 發(fā)短信
- (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content;
// 打印品牌信息
+ (void)brand;
@end
>>>.m
#import "Phone.h"
@implementation Phone
- (void)signalWithNumber:(NSString *)number
{
NSLog(@"利用手機(jī)打電話給%@",number);
}
- (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content
{
NSLog(@"利用手機(jī)發(fā)短信給%@,內(nèi)容是%@",number,content);
}
+ (void)brand
{
NSLog(@"品牌");
}
@end
iPhone
>>>.h
#import <Foundation/Foundation.h>
#import "Phone.h"
@interface IPhone : Phone
{
// 注意 : 在繼承中方法可以重寫(xiě),但是屬性(成員變量)不能重寫(xiě)
// int _cpu; // duplicate member 'cpu'
}
- (void)setCpu:(int)cpu;
- (int)cpu;
// 打電話
// 如果子類(lèi)中 有父類(lèi)中同名的方法,那么我們稱之為方法重寫(xiě)
// 注意: 繼承中的方法調(diào)用順序, 如果自己有 就調(diào)用自己的,如果自己沒(méi)有調(diào)用父類(lèi)的
// 方法的調(diào)用順序, 先自己再父類(lèi), 如果父類(lèi)中沒(méi)有 再找爺爺類(lèi),如果爺爺類(lèi)再?zèng)]有 就找 爺爺?shù)陌职诸?lèi)
// 如果一直找到 NSObject類(lèi)沒(méi)有找到, 那么就會(huì)報(bào)錯(cuò)
//Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[IPhone signalWithNumber:]: unrecognized selector sent to instance 0x1002000b0'
- (void)signalWithNumber:(NSString *)number;
// 在繼承中除了 對(duì)象方法可以重寫(xiě),類(lèi)方法也可以重寫(xiě)
+ (void)brand;
@end
>>>.m
#import "IPhone.h"
@implementation IPhone
- (void)setCpu:(int)cpu
{
_cpu = cpu;
}
- (int)cpu
{
return _cpu;
}
- (void)signalWithNumber:(NSString *)number
{
NSLog(@"利用 iPhone打電話給%@",number);
}
+ (void)brand
{
NSLog(@"iphone手機(jī)");
}
@end
Android
>>>.h
#import <Foundation/Foundation.h>
#import "Phone.h"
@interface Android : Phone
- (void)setCpu:(int)cpu;
- (int)cpu;
@end
>>>.m
@implementation Android
- (void)setCpu:(int)cpu
{
_cpu = cpu;
}
- (int)cpu
{
return _cpu;
}
@end

image.png

image.png