2011年5月17日 星期二

Foundation Framework-複製物件 CH18-3 Protocol

//

// main.m

// CH18-3 Copying Fractions

//

// Created by jason on 2011/5/17.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


//#import


// 使用copy方法需要實作 (NSCopying)中的1~2種方法


#import

#import


@interface Fraction:NSObject //<= 加上 NSCopying協定 protocol

{

int numerator;

int denominator;

}


@property int numerator, denominator;

- (void) print: (BOOL) needReduce;

- (void) setTo: (int) n over:(int) d;

- (double) converToNum;

- (Fraction *) add:(Fraction *)f;

- (Fraction *) subtract:(Fraction *)f;

- (Fraction *) multiply:(Fraction *)f;

- (Fraction *) divide:(Fraction *)f;

- (void) reduce;


@end


@implementation Fraction


@synthesize numerator,denominator;


- (void) setTo: (int) n over:(int) d{

numerator=n;

denominator=d;

}



- (void) print:(BOOL) needReduce{

if(needReduce)

[self reduce];

NSLog(@"the Fraction is %i/%i",numerator,denominator);

}


-(double) converToNum{

if(denominator!=0)

return (double)numerator/denominator;

else

return 1.0;

}


- (Fraction *) add:(Fraction *)f{

Fraction *result=[Fraction new];

int n,d;

if(denominator==0){

n=f.numerator;

d=f.denominator;

}else{

n=numerator*f.denominator+f.numerator*denominator;

d=denominator*f.denominator;

}

[result setTo:n over:d];

[result reduce];

return result;

}


- (Fraction *) subtract:(Fraction *)f{

Fraction *result=[Fraction new];

int n,d;

if (denominator==0){

n=f.numerator;

d=f.denominator;

[result setTo:n over:d];

}else{

n=numerator*f.denominator-f.numerator*denominator;

d=denominator*f.denominator;

[result setTo:n over:d];

[result reduce];

}

return result;

}

- (Fraction *) multiply:(Fraction *)f{

Fraction *result=[Fraction new];

int n,d;

if (denominator==0){

n=0;

d=0;

[result setTo:n over:d];

}else{

n=numerator*f.numerator;

d=denominator*f.denominator;

[result setTo:n over:d];

[result reduce];

}

return result;

}

- (Fraction *) divide:(Fraction *)f{

Fraction *result=[Fraction new];

int n,d,temp;

if (denominator==0){

n=0;

d=0;

[result setTo:n over:d];

}else{

temp=f.numerator;

f.numerator=f.denominator;

f.denominator=temp;

result=[self multiply:f];

[result reduce];

}

return result;

}


- (void) reduce{

int u=numerator;

int v=denominator;

int temp;

while(v!=0){

temp = u%v;

u=v;

v=temp;

}

numerator/=u;

denominator/=u;

}


-(id) copyWithZone: (NSZone *)zone // 為我們的參數配置記憶體區段

{

Fraction *newFract =[[Fraction allocWithZone:zone] init]; // 若這個類別為子類別 ,這裡要用 Fraction *newFract =[[[self class] allocWithZone:zone] init]; 我們新配置的物件方法來自於 copy的接收者

// 例如: 它是 Fraction 類別的子類別叫 NewFraction, 我們要在繼承的方法中配置一個 NewFraction的物件來取代 Fraction物件

// 若父類別已經實作了 ,我們要先呼叫父類別的 copy 方法 ,以複製繼承下來的實體變數 , 然後加上自己的code來加入新的實體變數

[newFract setTo: numerator over: denominator];

return newFract;

}

@end


int main(int argc, char *argv[])

{

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

Fraction *f1 = [[Fraction alloc] init];

Fraction *f2;

[f1 setTo:2 over:5];

f2 = [f1 copy];

[f2 setTo:1 over:3];

[f1 print: NO]; // => 2/5

[f2 print: NO]; // => 1/3 , f1&f2有各自獨立的記憶體空間

[f1 release];

[f2 release];

[pool drain];

return 0;

//return NSApplicationMain(argc, (const char **) argv);

}

沒有留言: