一、匿名對象
// Car *car = [Car new];
// [car run]; //調(diào)用方法
// car->_speed = 250; //設(shè)定實(shí)例變量的值
// NSLog(@"_speed = %d",car->_speed);
//匿名對象
//匿名對象的使用
// 1) 可以訪問實(shí)例變量
// 注意:使用匿名對象訪問實(shí)例變量须误,只能正確地使用一次
[Car new]->_speed = 180;
NSLog(@"_spped = %d",[Car new]->_speed); //0 [Car new]; 又分配了新的內(nèi)存空間
// 2) 可以調(diào)用方法
[[Car new] run];
//申請空間挨稿,并且初始化
Car *bigBen = [[Car alloc] init];
//注意:alloc init 等價(jià)于 new
二、封裝性
所謂封裝京痢,就是把一個事物包裝起來奶甘,使外界不了解它的內(nèi)部的具體情況。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中祭椰,封裝就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個有機(jī)的整體臭家,形成數(shù)據(jù)和操作代碼的封裝體,對外只提供一個可以控制的接口方淤,內(nèi)部大部分的實(shí)現(xiàn)細(xì)節(jié)對外隱蔽钉赁,達(dá)到對數(shù)據(jù)訪問權(quán)的合理控制。
封裝使程序中個部分之間的相互聯(lián)系達(dá)到最小携茂,提高了程序的安全性你踩,簡化了程序代碼的編寫工作,是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要原則讳苦。
面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝機(jī)制是通過對象來實(shí)現(xiàn)的带膜。對象中的成員不僅包含了數(shù)據(jù),也包含了對這些數(shù)據(jù)進(jìn)行處理的操作代碼医吊。對象中的成員可以根據(jù)需要定義為公有 的或私有的钱慢,私有成員在對象中被隱蔽起來,對象以外的訪問被拒絕卿堂,公有成員提供了對象與外界的接口,外界只能通過這個接口與對象發(fā)生聯(lián)系结啼∷徽可見,對象有效 地實(shí)現(xiàn)了封裝的兩個目標(biāo):對數(shù)據(jù)和行為的結(jié)合和信息隱蔽顶燕。
抽象和封裝是互補(bǔ)的穗慕。一個好的抽象有利于封裝饿敲,封裝的實(shí)體則幫助維護(hù)抽象的完整性。但抽象先于封裝
三逛绵、繼承與封裝的關(guān)系
對象具有封裝性怀各,對象的私有成員是被隱藏的,那么术浪,引入繼承機(jī)制不就削弱了封裝性瓢对?繼承與封裝不就茅盾了嗎?回答是否定的胰苏。
一方面硕蛹,繼承機(jī)制并不影響對象的封裝性。封裝的單位是對象硕并,是將屬于某個類的一個對象封裝起來法焰,使其操作和數(shù)據(jù)成為一個整體。如果該對象所在的類是派生類倔毙,這個派生類只要把從基類那里繼承來的數(shù)據(jù)和操作與自己的數(shù)據(jù)和操作一并封裝起來就行了埃仪,對象依然是一個封裝好的整體,仍然只能通過消息傳遞與別的對象交互陕赃,不能直接調(diào)用卵蛉。可見凯正,在引入繼承機(jī)制以后毙玻,無論對象是基類的實(shí)例還是派生的實(shí)例,都是一個被封裝的實(shí)體廊散,繼承并不影響封裝性桑滩。
另一方面,繼承和封裝都提供了共享代碼的手段允睹,增加了代碼的復(fù)用性运准。只不過,繼承的代碼共享是靜態(tài)的缭受,當(dāng)派生類對象被激活以后胁澳,自動共享其基類中的代碼,從而實(shí)現(xiàn)基類對象與派生類對象共享一段代碼米者。而封裝的代碼共享是動態(tài)的韭畸,當(dāng)在一個類中說明了一段代碼宇智,屬于該類的多個實(shí)力在程序運(yùn)行時(shí)共享這段代碼。
四胰丁、多態(tài)性
多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性之一随橘,是指不同的對象受到相同的消息時(shí)產(chǎn)生不同的操作行為,或者說同一個消息可以根據(jù)發(fā)送消息的對象的不同而采用多種不同的操作行為锦庸。
例如机蔗,當(dāng)用鼠標(biāo)單擊不同的對象時(shí),各對象就會根據(jù)自己的理解作出不同的動作甘萧,產(chǎn)生不同的結(jié)果,這就是多態(tài)性扬卷。簡單地說牙言,多態(tài)性就是一個接口,多種方式嬉挡。
五、對象間關(guān)系
對象間關(guān)系有組合關(guān)系汇恤、依賴關(guān)系庞钢、關(guān)聯(lián)關(guān)系