程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法_第1頁(yè)
程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法_第2頁(yè)
程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法_第3頁(yè)
程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法_第4頁(yè)
程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法用于處理分?jǐn)?shù)的Objective-C類(lèi)3.3@interface部分3.4實(shí)例和方法3.2到底什么是對(duì)象3.1第3章類(lèi)、對(duì)象和方法實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝3.7小結(jié)3.8program部分3.6@implementation部分3.53.1到底什么是對(duì)象對(duì)象使用對(duì)象執(zhí)行的操作你的汽車(chē)駕駛加油洗車(chē)維修對(duì)象就是一個(gè)事物。把面向?qū)ο蟮某绦蛟O(shè)計(jì)看成一個(gè)事物,而且相對(duì)這個(gè)事物做些工作。與C語(yǔ)言不同,C語(yǔ)言通常稱為過(guò)程性語(yǔ)言。在C語(yǔ)言中,通常先考慮要做什么,然后才關(guān)注對(duì)象。與面向?qū)ο蟮乃伎歼^(guò)程相反。在面向?qū)ο蟮挠谜Z(yǔ)中,“你的汽車(chē)”是汽車(chē)的一個(gè)實(shí)例。如果繼續(xù)使用術(shù)語(yǔ),car就是類(lèi)的名稱,這個(gè)實(shí)例就是從該類(lèi)創(chuàng)建的。因此,每制造一輛新汽車(chē),就會(huì)創(chuàng)建汽車(chē)類(lèi)的一個(gè)新實(shí)例,而且汽車(chē)的每個(gè)實(shí)例都稱作一個(gè)對(duì)象。表3-1對(duì)象的操作程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法用于處理分?jǐn)?shù)的Objective-C類(lèi)3.3@interface部分3.4實(shí)例和方法3.2到底什么是對(duì)象3.13.2實(shí)例和方法對(duì)象是類(lèi)的獨(dú)特表示,每個(gè)對(duì)象都包含一些通常對(duì)該對(duì)象來(lái)說(shuō)是私有的信息(數(shù)據(jù))。方法提供訪問(wèn)和改變這些數(shù)據(jù)的手段。

[ClassOrInstancemethod];

方括號(hào)后緊跟類(lèi)的名稱或該類(lèi)的實(shí)例名稱一個(gè)或多個(gè)空格要執(zhí)行的方法分號(hào)終止請(qǐng)求一個(gè)類(lèi)或?qū)嵗齺?lái)執(zhí)行某個(gè)操作時(shí),就是在向它發(fā)送一條消息,消息的接收者稱為接收者。因此有另一種方法可以表示前面所表示的一般格式。[receivermessage];程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.2實(shí)例和方法回顧上一個(gè)列表,使用新語(yǔ)法為它編寫(xiě)所有方法。在此之前,你需要獲得一輛車(chē)。去制造廠購(gòu)買(mǎi)一輛,如下:

yourCar=[Carnew];

得到一輛新車(chē)向Car類(lèi)(消息的接收者)發(fā)送一條消息,請(qǐng)求它賣(mài)給你一輛新車(chē)。得到的對(duì)象將被存儲(chǔ)到變量yourCar中。因?yàn)槟愕街圃鞆S購(gòu)買(mǎi)了一輛新汽車(chē),所以這個(gè)新汽車(chē)叫做制造廠方法,或者類(lèi)方法。對(duì)新車(chē)執(zhí)行的其余操作都將是實(shí)例方法,因?yàn)樗鼈儜?yīng)用于你的新車(chē)。

[yourCarprep];準(zhǔn)備好第一次使用[yourCardrive];駕駛汽車(chē)[yourCarwash];洗車(chē)[yourCargetGas];如果需要就給汽車(chē)加油[yourCarservice];維修

[yourCartopDown];是否為一輛敞篷車(chē)[yourCartopUp];

程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.2實(shí)例和方法

currentMileage=[yourCarcurrentOdometer];

該方法顯示的實(shí)例方法可返回信息,即當(dāng)前的行駛里程,該信息存儲(chǔ)在程序中的currentMileage變量?jī)?nèi)。將同一個(gè)方法應(yīng)用于不同的對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)背后的主要概念之一。對(duì)象可能是面向計(jì)算機(jī)的對(duì)象,例如窗口,矩形,一段文本,或者是計(jì)算器,歌曲的播放列表。就像用于汽車(chē)的方法:

[myWindowerase];清除窗口[myRectgetArea];計(jì)算矩形的面積[UserTextspellCheck];對(duì)一些文本進(jìn)行拼寫(xiě)檢查[deskCalculatorclearEntry];清除最后一次輸入[favoritePlaylistshowSongs];在播放列表顯示喜歡的歌曲[phoneNumberdial];撥號(hào)程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法@interface部分3.4實(shí)例和方法3.2用于處理分?jǐn)?shù)的Objective-C類(lèi)3.3到底什么是對(duì)象3.13.3用于處理分?jǐn)?shù)的Objective-C類(lèi)假設(shè)要編寫(xiě)一個(gè)用于處理分?jǐn)?shù)的程序??赡苄枰幚砑訙p乘除等運(yùn)算。如果不知道什么是類(lèi),那么可使用如下程序:代碼清單3-1---------------------------------------------------------------------------------------------------//Simpleprogramtoworkwithfractions#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intnumerator=1;

intdenominator=3;

NSLog(@”Thefractionis%i/%i”,numerator,denominator);

}return0;}---------------------------------------------------------------------------------------------------代碼清單3-1輸出:Thefractionis1/3程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.3用于處理分?jǐn)?shù)的Objective-C類(lèi)在代碼清單3-1中,分?jǐn)?shù)是以分子和分母的形式表示的。創(chuàng)建自動(dòng)釋放池后,main中的前兩行,將變量numerator和denominator都聲明為整型,并賦予它們初值1和3.這兩個(gè)程序行與下面的程序行等價(jià):

intnumerator,denominator;numerator=1;denominator=3;

通過(guò)將1存儲(chǔ)到變量numerator中,將3存儲(chǔ)到變量denominator中可表示分?jǐn)?shù)1/3。如果需要在程序中存儲(chǔ)多個(gè)分?jǐn)?shù),這種方法可能比較麻煩。每次要引用分?jǐn)?shù)時(shí),都必須引用相應(yīng)的分子和分母。

如果能把一個(gè)分?jǐn)?shù)定義成單個(gè)實(shí)體,用單個(gè)名稱(例如myFraction)來(lái)共同引用它的分子和分母,那么會(huì)更好。這種方法可以使用objective-C來(lái)實(shí)現(xiàn),并從定義一個(gè)新類(lèi)開(kāi)始。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.3用于處理分?jǐn)?shù)的Objective-C類(lèi)代碼清單3-2使用一個(gè)名為Fraction的新類(lèi)重寫(xiě)代碼清單3-1中的函數(shù)。代碼清單3-2---------------------------------------------------------------------------------------------------//Programtoworkwithfractions–classversion#import<Foundation/Foundation.h>//----@interfacesection----@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)n;-(void)setDenominator:(int)d;@end程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.3用于處理分?jǐn)?shù)的Objective-C類(lèi)

代碼清單3-2(續(xù))-----------------------------------------------------------------------------------------------//----@implementationsection----@implementationFraction-(void)print{NSLog(@”%i/%i”,numerator,denominator);}-(void)setNumerator:(int)n{numerator=n;}-(void)setDenominator:(int)d{denominator=d;}@end程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.3用于處理分?jǐn)?shù)的Objective-C類(lèi)代碼清單3-2(續(xù))---------------------------------------------------------------------------------------------------//----programsection----intmain(intargc,char*argv[]){ @autoreleasepool{

Fraction*myFraction;

//CreateaninstanceofaFraction

myFraction=[Fractionalloc];

myFraction=[myFractioninit];

//Setfractionto1/3

[myFractionsetNumerator:1];

[myFractionsetDenominator:3];

//Displaythefractionusingtheprintmethod

NSLog(@”ThevalueofmyFractionis:”);

[myFractionprint]; }return0;}程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.3用于處理分?jǐn)?shù)的Objective-C類(lèi)代碼清單3-2輸出ThevalueofmyFractionis:1/3從代碼清單3-2的注釋中可以看到,程序在邏輯上分為3個(gè)部分:@interface部分@implementation部分program部分@interface部分用于描述類(lèi),類(lèi)的數(shù)據(jù)成分以及類(lèi)的方法;而@implementation部分包括實(shí)現(xiàn)這些方法的實(shí)際代碼。最后program部分包含實(shí)現(xiàn)程序預(yù)期目的的程序代碼。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法用于處理分?jǐn)?shù)的Objective-C類(lèi)3.3實(shí)例和方法3.2@interface部分3.4到底什么是對(duì)象3.13.4@interface部分定義新類(lèi)時(shí),首先,要通知Objective-C編譯器這個(gè)類(lèi)來(lái)自何處。就是說(shuō),必須命名它的父類(lèi)。其次,必須確定這個(gè)類(lèi)對(duì)象要存儲(chǔ)的數(shù)據(jù)的類(lèi)型。就是說(shuō),必須描述類(lèi)成員將包含的數(shù)據(jù)。我們把這些成員叫做實(shí)例變量。最后,還必須定義在處理該類(lèi)的對(duì)象時(shí)將要用到的各種操作或方法的類(lèi)型。這些工作都在程序中名為@interface的特殊部分內(nèi)完成。該部分的一般格式類(lèi)似于:@interfaceNewClassName:ParentClassName{memberDeclarations;}methodDeclarations;@end程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.1選擇名稱制定名稱的規(guī)則相當(dāng)簡(jiǎn)單:名稱必須以字母或下劃線(_)開(kāi)頭,之后可以是任何(大寫(xiě)或小寫(xiě))字母、下劃線或者0到9之間的數(shù)字組合。

下面是一列合法的名稱:以下名稱是非法的:sumpieceFlagimyLocationnumberOfMove_sysFlagChessBoardsum$value$是一個(gè)非法字符pieceflag名稱中間不允許插入空格3Spencer不能以數(shù)開(kāi)頭int保留字程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.1選擇名稱int不能做變量名,因?yàn)槠溆猛緦?duì)Objective-C編譯器而言有特殊含義。這個(gè)是用稱為保留字或保留名,一般來(lái)說(shuō),任何對(duì)Objective-C編譯器有特殊意義的名稱都不能作為變量名是用。附錄B“Objective-C2.0語(yǔ)言總結(jié)”中,提供了這些保留名的完整列表。應(yīng)該始終記住,Objective-C中的大寫(xiě)字母和小寫(xiě)字母是有區(qū)別的。因此,變量名sum、Sum和SUM都表示不用的變量。注意,在命名類(lèi)時(shí),類(lèi)名要以大寫(xiě)字母開(kāi)始。另一方面,實(shí)例變量,對(duì)象以及方法的名稱,通常以小寫(xiě)字母開(kāi)始。為使程序具有可讀性,名稱中要用大寫(xiě)字母來(lái)表示新單詞的開(kāi)始:AddressBook可能是一個(gè)類(lèi)名currentEntry可能是一個(gè)對(duì)象current_entry一些程序員還是用下劃線作為單詞的分隔符addNewEntry可能是一個(gè)方法名確定名稱時(shí),要遵循同樣的標(biāo)準(zhǔn)。要找出能反映出變量或?qū)ο笫褂靡鈭D的名稱。富有意義的名稱可以顯著增強(qiáng)程序的可讀性,并在調(diào)試和歸檔階段受益匪淺。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.1選擇名稱一下是代碼清單3-2中的@interface部分//----@interfacesection----@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)n;-(void)setDenominator:(int)d;@end新類(lèi)的名稱為Fraction,其父類(lèi)為NSObject。NSObject類(lèi)在文件NSObject.h中定義,導(dǎo)入Foundation.h文件時(shí)會(huì)在程序中自動(dòng)包括這個(gè)類(lèi)。類(lèi)名父類(lèi)程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.2實(shí)例變量memberDeclaration部分指定了哪種類(lèi)型的數(shù)據(jù)將要存儲(chǔ)到Fraction中,以及這些數(shù)據(jù)類(lèi)型的名稱??梢钥吹剑@一部分放入自己的一組花括號(hào)內(nèi)。對(duì)Fraction類(lèi)而言,聲明intnumerator;intdenominator;表示Fraction對(duì)象有兩個(gè)名為numerator和denominator的整型成員。在這一部分聲明的成員稱為實(shí)例變量。每次創(chuàng)建新對(duì)象時(shí),將同時(shí)創(chuàng)建一組新的實(shí)例變量,而且是唯一的一組。因此,如果擁有兩個(gè)Fraction對(duì)象,一個(gè)名為fracA,另一個(gè)名為fracB,那么每一個(gè)都將有自己的一組實(shí)例變量。就是說(shuō),fracA和fracB各自將擁有獨(dú)立的numerator和denominator。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.3類(lèi)和實(shí)例方法必須定義各種方法才能使用Fractions。需要能夠?qū)⒎謹(jǐn)?shù)的值設(shè)為特定的值。因?yàn)椴荒苤苯釉L問(wèn)分?jǐn)?shù)的內(nèi)部表示(就是直接訪問(wèn)他的實(shí)例變量),因此必須編寫(xiě)方法來(lái)設(shè)置分子和分母。還要編寫(xiě)一個(gè)名為print的方法來(lái)顯示分?jǐn)?shù)的值。下面是print方法的聲明,應(yīng)該位于接口文件中:

-(void)print;

開(kāi)頭的負(fù)號(hào)(-)通知objective-C編譯器,該方法是一個(gè)實(shí)例方法。其他唯一的選擇是正號(hào)(+),它表示類(lèi)方法。類(lèi)方法是類(lèi)本身執(zhí)行某些操作的方法。實(shí)例方法對(duì)類(lèi)的特定實(shí)例執(zhí)行一些操作。

程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.3類(lèi)和實(shí)例方法

返回值聲明新方法時(shí),必須通知Objective-C編譯器這個(gè)方法是否返回值,如果返回值,那么返回哪種類(lèi)型的值。將返回類(lèi)型放入開(kāi)頭的負(fù)號(hào)或正號(hào)之后的圓括號(hào)中。

-(int)retrieveNumerator;指定名為retrieveNumerator的實(shí)例方法返回一個(gè)整型值。

-(double)retrieveDoubleValue;聲明了一個(gè)返回雙精度的方法。如果方法不返回值,可以用void類(lèi)型表示:

-(void)print;這條語(yǔ)句聲明了一個(gè)名為print的方法,它不返回任何值。在這種情況下,無(wú)需在方法結(jié)尾執(zhí)行return語(yǔ)句。相反,可以執(zhí)行一條不帶任何指定值的return語(yǔ)句。無(wú)需為方法指定返回類(lèi)型,盡管那樣做是一個(gè)較好的編程習(xí)慣。如果沒(méi)有指定任何類(lèi)型,那么id將是默認(rèn)類(lèi)型?;旧希琲d類(lèi)型可用來(lái)引用任何類(lèi)型的對(duì)象。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.3類(lèi)和實(shí)例方法

方法的參數(shù)

代碼清單3-2的@interface部分聲明了其他兩個(gè)方法:

–(void)setNumerator:(int)n;–(void)setDenominator:(int)d;

它們都是不返回值的實(shí)例方法。每個(gè)方法都有一個(gè)整型參數(shù),這是通過(guò)參數(shù)名前面的(int)指明的。就setNumerator來(lái)說(shuō),其參數(shù)名是n。這個(gè)名稱可以是任意的,它是用來(lái)引用參數(shù)的方法名稱。因此,setNumerator的聲明指定向該方法傳遞一個(gè)名為n的整型參數(shù),而該方法沒(méi)有返回值。要注意聲明這些方法的語(yǔ)法,每個(gè)方法名都以冒號(hào)結(jié)束,這個(gè)冒號(hào)通知Objective-C編譯器該方法期望看到一個(gè)參數(shù)。然后指定參數(shù)的類(lèi)型,并將其放入一對(duì)圓括號(hào)中。最后,使用象征性的名稱來(lái)確定方法所指定的參數(shù)。整個(gè)聲明以一個(gè)分號(hào)結(jié)束。

-(void)setNumerator:(int)n;方法類(lèi)型返回類(lèi)型方法名方法接受的參數(shù)參數(shù)類(lèi)型參數(shù)名程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.4.3類(lèi)和實(shí)例方法

方法的參數(shù)如果一個(gè)方法接受一個(gè)參數(shù),那么在引用該方法時(shí)在方法后附加一個(gè)冒號(hào)。因此setNumerator:和setDenominator:是指定這兩個(gè)方法的正確方式,每個(gè)方法都有一個(gè)參數(shù)。同樣,在指定print方法時(shí),沒(méi)有使用后綴的冒號(hào),這表明此方法不帶任何參數(shù)。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝3.7小結(jié)3.8program部分3.6@implementation部分3.53.5@implementation部分@implementation部分包含聲明在@interface部分的方法的實(shí)際代碼。就是說(shuō),在@interface部分聲明方法并在@implementation部分定義它們(給出實(shí)際代碼)。

@implementation部分的一般格式如下:@implementationNewClassNamemethodDefinitions;@end

NewClassName表示的名稱與@interface部分的類(lèi)名相同。可以在父類(lèi)的名稱之前使用冒號(hào)。

@implementationFraction:NSObject

該方法是可選的而且通常不這么做。@implementation部分中的methodDefinition部分包含在@interface部分指定的每個(gè)方法的代碼。與@interface部分類(lèi)似,每種方法的定義首先指定方法的類(lèi)型,返回類(lèi)型,參數(shù)及其類(lèi)型。然而,并沒(méi)有使用分號(hào)來(lái)結(jié)束該行,而是將之后的方法代碼放入一對(duì)花括號(hào)中。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.5@implementation部分以下是代碼清代3-2的@implementation部分://----@implementationsection----@implementationFraction–(void)print{NSLog(“%i/%i”,numerator,denominator);}–(void)setNumerator:(int)n{numerator=n;}–(void)setDenominator:(int)d{denominator=d;}@endsetNumerator方法具有一個(gè)名為n的參數(shù),并簡(jiǎn)單地存儲(chǔ)到實(shí)例變量numerator中setDenominator將其參數(shù)d的值存儲(chǔ)到實(shí)例變量denominator中。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法第3章類(lèi)、對(duì)象和方法實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝3.7小結(jié)3.8program部分3.6@implementation部分3.53.6Program部分program部分包含解決特定問(wèn)題的代碼。如果有必要,它可以跨越多個(gè)文件。必須在其中一個(gè)地方有一個(gè)名為main的例程。通常情況下,這是程序開(kāi)始執(zhí)行的地方。以下是代碼清單3-2的program部分://----programsection----intmain(intargc,char*argv[]){ @autoreleasepool{

Fraction*myFraction;

//CreateaninstanceofaFraction

myFraction=[Fractionalloc];

myFraction=[myFractioninit];

//Setfractionto1/3

[myFractionsetNumerator:1];

[myFractionsetDenominator:3];

//Displaythefractionusingtheprintmethod

NSLog(@”ThevalueofmyFractionis:”);

[myFractionprint]; }return0;}程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分在main中,使用以下程序行定義了一個(gè)名為myFraction的變量:

Fraction*myFraction;這個(gè)行表示myFraction是一個(gè)Fraction類(lèi)型的對(duì)象;就是說(shuō),myFraction用于存儲(chǔ)來(lái)自新的Fraction類(lèi)變量。myFraction前面的星號(hào)(*)是必須的。它實(shí)際表示myFraction是對(duì)Fraction的一個(gè)引用(指針)。當(dāng)擁有了一個(gè)存儲(chǔ)Fraction的對(duì)象后,需要?jiǎng)?chuàng)建一個(gè)分?jǐn)?shù)??梢杂靡韵鲁绦蛐袑?shí)現(xiàn):

myFraction=[Fractionalloc];

alloc是allocate的縮寫(xiě)。因?yàn)橐獮樾路謹(jǐn)?shù)分配內(nèi)存存儲(chǔ)空間。表達(dá)式[Fractionalloc]向新創(chuàng)建的Fraction類(lèi)發(fā)送一條消息。將alloc消息發(fā)送給一個(gè)類(lèi)時(shí),便獲得該類(lèi)的一個(gè)新實(shí)例。在代碼清單3-2中,返回值存儲(chǔ)在變量myFraction中。alloc方法保證對(duì)象的所有實(shí)例變量都變成初始狀態(tài)。當(dāng)然,這并不意味著該對(duì)象進(jìn)行了適當(dāng)?shù)某跏蓟梢允褂谩?/p>

在分配(alloc)對(duì)象之后,還必須對(duì)它初始化:

myFraction=[myFractioninit];

這里使用了一個(gè)并非自己編寫(xiě)的方法init。init方法用于初始化類(lèi)的實(shí)例變量。注意,這里將init方法發(fā)送給myFraction。就是說(shuō),在這里初始化的是Fraction的一個(gè)特殊對(duì)象,因此并沒(méi)有把方法發(fā)送給類(lèi),而是給了類(lèi)的實(shí)例。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分在main中,使用以下程序行定義了一個(gè)名為myFraction的變量:

Fraction*myFraction;這個(gè)行表示myFraction是一個(gè)Fraction類(lèi)型的對(duì)象;就是說(shuō),myFraction用于存儲(chǔ)來(lái)自新的Fraction類(lèi)變量。myFraction前面的星號(hào)(*)是必須的。它實(shí)際表示myFraction是對(duì)Fraction的一個(gè)引用(指針)。當(dāng)擁有了一個(gè)存儲(chǔ)Fraction的對(duì)象后,需要?jiǎng)?chuàng)建一個(gè)分?jǐn)?shù)??梢杂靡韵鲁绦蛐袑?shí)現(xiàn):

myFraction=[Fractionalloc];

alloc是allocate的縮寫(xiě)。因?yàn)橐獮樾路謹(jǐn)?shù)分配內(nèi)存存儲(chǔ)空間。表達(dá)式[Fractionalloc]向新創(chuàng)建的Fraction類(lèi)發(fā)送一條消息。將alloc消息發(fā)送給一個(gè)類(lèi)時(shí),便獲得該類(lèi)的一個(gè)新實(shí)例。在代碼清單3-2中,返回值存儲(chǔ)在變量myFraction中。alloc方法保證對(duì)象的所有實(shí)例變量都變成初始狀態(tài)。當(dāng)然,這并不意味著該對(duì)象進(jìn)行了適當(dāng)?shù)某跏蓟梢允褂谩?/p>

在分配(alloc)對(duì)象之后,還必須對(duì)它初始化:

myFraction=[myFractioninit];

這里使用了一個(gè)并非自己編寫(xiě)的方法init。init方法用于初始化類(lèi)的實(shí)例變量。注意,這里將init方法發(fā)送給myFraction。就是說(shuō),在這里初始化的是Fraction的一個(gè)特殊對(duì)象,因此并沒(méi)有把方法發(fā)送給類(lèi),而是給了類(lèi)的實(shí)例。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分init方法也可以返回一個(gè)值,即被初始化的對(duì)象。將返回的值存儲(chǔ)到Fraction的變量myFraction中。下面兩行代碼分配了類(lèi)的新實(shí)例并做了初始化,這兩條消息在Objective-C中很常見(jiàn),通常組合到一起:

myFraction=[[Fractionalloc]init];內(nèi)部消息表達(dá)式[Fractionalloc]將首先求值。可以看到,這條消息表達(dá)式的結(jié)果是已分配的實(shí)際Fraction。對(duì)它直接應(yīng)有init方法,而不是像以前那樣把分配結(jié)果存儲(chǔ)到一個(gè)變量中。作為最終的簡(jiǎn)寫(xiě)形式,經(jīng)常把分配和初始化直接合并到聲明行:

Fraction*myFraction=[[Fractionalloc]init];

到目前為止,在每個(gè)程序中都看到了如何分配自動(dòng)釋放池:

NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];

此處將alloc消息發(fā)送給NSAutoreleasePool類(lèi),請(qǐng)求創(chuàng)建一個(gè)新實(shí)例。然后向新創(chuàng)建的對(duì)象發(fā)送init消息,以初始化該對(duì)象。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分在代碼清單3-2中,現(xiàn)在已經(jīng)能夠設(shè)置分?jǐn)?shù)的值://Setfractionto1/3[myFractionsetNumerator:1];[myFractionsetDenominator:3];

第一條消息語(yǔ)句把消息setNumerator:發(fā)送給myFraction。提供一個(gè)值為1的參數(shù)。然后將控制發(fā)送給Fraction類(lèi)定義的setNumerator:方法。因?yàn)镺bjective-C系統(tǒng)知道m(xù)yFraction是Fraction類(lèi)的對(duì)象,因此它知道setNumerator:是要從Fraction類(lèi)使用一個(gè)方法。在setNumerator:方法中,將傳遞來(lái)的值1存儲(chǔ)在變量n中。該方法中的唯一程序行獲得該值并由實(shí)例變量numerator存儲(chǔ)這個(gè)值。因此,myFraction的分子已經(jīng)被有效地設(shè)置為1。其后的消息用于調(diào)用myFraction的setDenominator方法。在setDenominator:方法中,參數(shù)3被賦值給變量d。然后把這個(gè)值存儲(chǔ)到實(shí)例變量denominator中,這樣就將myFraction賦值為1/3.程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分現(xiàn)在可以顯示此分?jǐn)?shù)的值://displaythefractionusingtheprintmethodNSLog(@”ThevalueofmyFractionis:”);[myFractionprint];NSlog調(diào)用僅顯示:ThevalueofmyFractionis:使用以下表達(dá)式調(diào)用print方法:

[myFractionprint];

在print方法中,將顯示實(shí)例變量numerator和denominator的值,并用斜杠(/)將其分隔。程序中消息:

[myFractionrelease];用于釋放Fraction對(duì)象使用的內(nèi)存。執(zhí)行這個(gè)操作是良好的程序設(shè)計(jì)風(fēng)格的重要部分。只要?jiǎng)?chuàng)建一個(gè)新對(duì)象,都要請(qǐng)求為該對(duì)象分配內(nèi)存。同樣,在完成對(duì)該對(duì)象的操作時(shí),必須釋放它所使用的內(nèi)存空間。盡管“程序以任何方式終止時(shí),都將釋放內(nèi)存”是事實(shí),但開(kāi)始創(chuàng)建更復(fù)雜的應(yīng)用程序之后,最終可以生成成百的對(duì)象,它們將占用大量?jī)?nèi)存。等到程序終止時(shí)才釋放內(nèi)存是對(duì)內(nèi)存的浪費(fèi),這會(huì)減慢程序的執(zhí)行速度。程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分以下例子展示如何在程序中使用多個(gè)分?jǐn)?shù)。在代碼清單3-3中,將一個(gè)分?jǐn)?shù)設(shè)置為2/3,另一個(gè)設(shè)置為3/7,然后同時(shí)顯示它們。代碼清單3-3----------------------------------------------------------------------------------------------------//Programtoworkwithfractions–cont’d#import<Foundation/Foundation.h>//----@interfacesection----@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)n;-(void)setDenominator:(int)d;@end程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分

//----@implementationsection----@implementationFraction-(void)print{NSLog(@”%i/%i”,numerator,denominator);}-(void)setNumerator:(int)n{numerator=n;}-(void)setDenominator:(int)d{denominator=d;}@end程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分

//----programsection----intmain(intargc,char*argv[]){ @autoreleasepool{

Fraction*frac1=[[Fractionalloc]init];

Fraction*frac2=[[Fractionalloc]init];

//Set1stfractionto2/3

[frac1setNumerator:2];

[frac1setDenominator:3];

//Set2ndfractionto3/7

[frac2setNumerator:3];

[frac2setDenominator:7];

//Displaythefractions

NSLog(@”Firstfractionis:”);

[frac1print];

NSLog(@”Secondfractionis:”);

[frac2print]; }return0;}程序設(shè)計(jì)第3章類(lèi)、對(duì)象和方法3.6Program部分代碼清單3-3輸出:

Firstfractionis:2/3Secondfractionis:3/7

@interface和@implementation部分和代碼3-2一樣。這個(gè)程序創(chuàng)建了兩個(gè)名為frac1和frac2的Fraction對(duì)象,然后將它們分別賦值為2/3和3/7。注意:當(dāng)frac1使用setNumerator:方法將其分子設(shè)置為2時(shí),實(shí)例變量frac1也將實(shí)例變量numerator設(shè)置為2。同樣,frac2使用相同的方法將其分子設(shè)置為3時(shí),它特有的實(shí)例變量numerator也被設(shè)置為3。每次創(chuàng)建新類(lèi)時(shí),該類(lèi)就獲得了自己特有的一組實(shí)例變量。對(duì)象frac1frac2實(shí)例變量numerator2denominator3numerator3denominator7第3章類(lèi)、對(duì)象和方法progam部分3.6小結(jié)3.8@implementation部分3.5實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝3.73.7實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝前面已經(jīng)看到處理分?jǐn)?shù)的方法如何通過(guò)名稱直接訪問(wèn)兩個(gè)實(shí)例變量numerator和denominator的情況。事實(shí)上,實(shí)例方法總是可以直接訪問(wèn)它的實(shí)例變量。然而,類(lèi)方法則不能,因?yàn)樗惶幚眍?lèi)本身,并不處理類(lèi)的任何實(shí)例。但是,如果要從其他位置訪問(wèn)實(shí)例變量,例如,從main例程內(nèi)部來(lái)訪問(wèn)。在這種情況下,不能直接訪問(wèn)這些實(shí)例變量,因?yàn)樗鼈兪请[藏的。將實(shí)例變量隱藏起來(lái)的這種做法實(shí)際上是稱為數(shù)據(jù)封裝的關(guān)鍵概念。它使得編寫(xiě)類(lèi)定義的人不必?fù)?dān)心程序員(即類(lèi)的使用者)是否破換類(lèi)的內(nèi)部細(xì)節(jié)的情況下,擴(kuò)展和修改他的類(lèi)定義。數(shù)據(jù)封裝提供了程序員和類(lèi)的開(kāi)發(fā)者之間良好隔離層。通過(guò)編寫(xiě)特殊方法來(lái)檢索實(shí)例變量的值,可以用一種新的方式來(lái)訪問(wèn)它們。例如,創(chuàng)建兩個(gè)非常恰當(dāng)?shù)孛麨閚umerator何denominator的方法,它們用來(lái)訪問(wèn)作為消息接受者的Fraction的相應(yīng)實(shí)例變量。結(jié)果將是相應(yīng)整數(shù)值:-(int)numerator;-(int)denominator;3.7實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝通過(guò)編寫(xiě)特殊方法來(lái)檢索實(shí)例變量的值,可以用一種新的方式來(lái)訪問(wèn)它們。例如,創(chuàng)建兩個(gè)非常恰當(dāng)?shù)孛麨閚umerator何denominator的方法,它們用來(lái)訪問(wèn)作為消息接受者的Fraction的相應(yīng)實(shí)例變量。結(jié)果將是相應(yīng)整數(shù)值:-(int)numerator;-(int)denominator;

定義:–(int)numerator{returnnumerator;}–(int)denominator{returndenominator;}

注意,它們?cè)L問(wèn)的方法名和實(shí)例變量名是相同的。這樣做不存在任何問(wèn)題;事實(shí)上,這是很常見(jiàn)的情況。3.7實(shí)例變量的訪問(wèn)以及數(shù)據(jù)封裝代碼清單3-4用來(lái)測(cè)試這兩個(gè)新方法:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論