一、封裝
學(xué)習(xí)過(guò)Java中類的同學(xué)可能都知道了潭千,封裝就是對(duì)類中的一些字段谱姓,方法進(jìn)行保護(hù),不被外界所訪問(wèn)到刨晴,有一種權(quán)限的控制功能屉来,Java中有四種訪問(wèn)權(quán)限修飾符:public路翻,default,protected奶躯,private,訪問(wèn)權(quán)限一次遞減的亿驾,這樣我們?cè)诙x類的時(shí)候嘹黔,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露莫瞬,可以通過(guò)修飾符來(lái)完成儡蔓,這就是封裝
在iOS中同樣有相同四種訪問(wèn)權(quán)限修飾符
@public、@protected疼邀、@private喂江、@package
其中默認(rèn)的修飾符是@private
注意:OC中方法是沒(méi)有修飾符的概念的,一般都是公開(kāi)訪問(wèn)的旁振,即public的获询,但是我們?cè)趺醋龅阶孫C中的一個(gè)方法不能被外界訪問(wèn)呢?可以使用匿名類別實(shí)現(xiàn)拐袜。
看個(gè)例子:car.h
<pre>
import <Foundation/Foundation.h>
@interface Car : NSObject{
//這個(gè)屬性就是對(duì)外進(jìn)行保密的相當(dāng)于private吉嚣,所以我們需要在外部訪問(wèn)的話,必須定義get/set方法
//默認(rèn)的是private的蹬铺,但是我們可以使用@public設(shè)置為public屬性的,那么在外部可以直接訪問(wèn):person->capcity = 2.8;
//當(dāng)然我們一般不這么使用尝哆,因?yàn)檫@會(huì)破壞封裝性,這種用法相當(dāng)于C中的結(jié)構(gòu)體中權(quán)限
//一共四種:@public,@protected,@private,@package,這個(gè)和Java中是相同的
@public
float _capcity; //油量屬性
}
- (void)run:(float)t;
@end
</pre>
二甜攀、繼承
繼承使得我們沒(méi)必要?jiǎng)e寫(xiě)重復(fù)的代碼秋泄,可重用性很高。當(dāng)然OC中的繼承和Java中是一樣的规阀,沒(méi)多大區(qū)別恒序。
舉個(gè)例子:
Car.h
<pre>
import <Foundation/Foundation.h>
@interface Car : NSObject{
NSString *_brand;
NSString *_color;
}
- (void)setBrand:(NSString *)brand;
- (void)setColor:(NSString *)color;
- (void)brake;
- (void)quicken;
@end
</pre>
Car.m
<pre>
import "Car.h"
@implementation Car
- (void)setBrand:(NSString *)brand{
_brand = brand;
} - (void)setColor:(NSString *)color{
_color = color;
} - (void)brake{
NSLog(@"剎車");
} - (void)quicken{
NSLog(@"加速");
}
@end
</pre>
再來(lái)看下子類:
Taxi.h
<pre>
import "Car.h"
@interface Taxi : Car{
NSString *_company;//所屬公司
}
//打印發(fā)票
- (void)printTick;
@end
</pre>
Taxi.m
<pre>
import "Taxi.h"
@implementation Taxi
- (void)printTick{
[super brake];
[self brake];
NSLog(@"%@出租車打印了發(fā)票,公司為:%@,顏色為:%@",_brand,_company,_color);
}
@end
</pre>
從代碼中我們可以發(fā)現(xiàn)Taxi類中多了一個(gè)屬性和方法
注意:
<pre>
- 編譯器從上往下執(zhí)行谁撼,所以在子類前面至少應(yīng)該要有父類的聲明
- OC中不允許子類和父類擁有相同名稱的成員變量名
- OC中的子類可以擁有和父類相同名稱的方法奸焙,在子類調(diào)用時(shí),優(yōu)先去自己的內(nèi)部尋找彤敛,如果沒(méi)有則一層一層的往上找
- OC語(yǔ)言是單繼承語(yǔ)言与帆。在OC語(yǔ)言中,基本上所有類的根類都是NSObject類
- 每個(gè)類中都有一個(gè)super class指針墨榄,該指針指向自己的父類玄糟。對(duì)象中有一個(gè)isa指針,該指針指向調(diào)用該對(duì)象的類
</pre>
三袄秩、多態(tài)
多態(tài)說(shuō)白了就是:定義類型和實(shí)際類型阵翎,一般是基于接口的形式實(shí)現(xiàn)的
舉個(gè)例子:
抽象的打印機(jī)類Printer
Printer.h
<pre>
@interface Printer : NSObject
- (void) print;
@ed
</pre>
Printer.m
<pre>
@implementation Printer
- (void)print{
NSLog(@"打印機(jī)打印紙張");
}
@end
</pre>
下面來(lái)看一下具體的子類
ColorPrinter.h
<pre>
//修改父類的打印行為
@interface ColorPrinter : Printer
- (void)print;
@end
</pre>
ColorPrinter.m
<pre>
import "ColorPrinter.h"
@implementation ColorPrinter
- (void)print{
NSLog(@"彩色打印機(jī)");
}
@end
</pre>
在看一下另外一個(gè)子類
BlackPrinter.h
<pre>
import "BlackPrinter.h"
@implementation BlackPrinter
- (void)print{
NSLog(@"黑白打印機(jī)");
}
@end
</pre>
BlackPrinter.m
<pre>
import "Person.h"
@implementation Person
(void) printWithColor:(ColorPrinter *)colorPrint{
[colorPrint print];
}(void) printWithBlack:(BlackPrinter *)blackPrint{
[blackPrint print];
}(void) doPrint:(Printer *)printer{
[printer print];
}
</pre>
再來(lái)看一下測(cè)試代碼:
main.m
<pre>
import "Person.h"
import "BlackPrinter.h"
import "ColorPrinter.h"
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Person *person =[[Person alloc] init];
ColorPrinter *colorPrint = [[ColorPrinter alloc] init];
BlackPrinter *blackPrint = [[BlackPrinter alloc] init];
//多態(tài)的定義
Printer *p1 = [[ColorPrinter alloc] init];
Printer *p2 = [[BlackPrinter alloc] init];
[person doPrint:p1];
[person doPrint:p2]
//通過(guò)控制臺(tái)輸入的命令來(lái)控制使用哪個(gè)打印機(jī)
int cmd;
do{
scanf("%d",&cmd);
if(cmd == 1){
[person doPrint:colorPrint];
}else if(cmd == 2){
[person doPrint:blackPrint];
}
}while (1);
}
return 0;
}
</pre>
這里的p1,p2表面上的類型是Printer逢并,但是實(shí)際類型是子類類型,所以會(huì)調(diào)用他們自己對(duì)應(yīng)的print方法郭卫。也就是1個(gè)方法其實(shí)調(diào)用的實(shí)現(xiàn)是不同的砍聊。