//
// 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);
}