標籤:
//// main.m// OC7類//// Created by Zoujie on 15/8/23.// Copyright (c) 2015年 Zoujie. All rights reserved.//#import <Foundation/Foundation.h>#import "Fraction.h"//匯入標頭檔#import "Complex.h"#define Choose 0int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); Fraction *myFraction = [Fraction new]; if (Choose) {// [myFraction setNumberator1:11]; myFraction.denominator1 = 11;// [myFraction setDenominator1:3]; myFraction.numberator1 = 3; } else { [myFraction setNumberator1:1 Denominator:7]; } NSLog(@"The value of myFraction"); [myFraction print]; NSLog(@"The value of myFranction:%i/%i",myFraction.numberator1,myFraction.denominator1); // add 傳入對象參數 Fraction *afraction = [Fraction new]; Fraction *bfraction = [Fraction new]; [afraction setNumberator1:1 Denominator:4]; [bfraction setNumberator1:1 Denominator:2]; [afraction print]; NSLog(@"+"); [bfraction print]; NSLog(@"=");// // [afraction add:bfraction];// [afraction print];// //// reduce 分數相約到最簡形式// [afraction reduce];// [afraction print];// // 在方法中分配和返回對象 Fraction *resultFraction; resultFraction = [afraction newAdd:bfraction]; [resultFraction print]; Fraction *subRusult = [bfraction subtract:afraction]; [subRusult print]; // 多態 不同類使用相同方法 Fraction *f1 = [Fraction new]; Fraction *f2 = [Fraction new]; Fraction *fracResult; Complex *c1 = [Complex new]; Complex *c2 = [Complex new]; Complex *complexResult; // [f1 setTo:1 over:10]; [f1 setNumberator1:1 Denominator:10]; [f2 setNumberator1:2 Denominator:15]; [c1 setReal:18.0 andImaginary:2.5]; [c2 setReal:-5.0 andImaginary:3.2]; [c1 print]; NSLog(@" +");[c2 print]; NSLog(@"------------"); complexResult = [c1 add:c2];// [complexResult reduce]; [complexResult print]; NSLog(@"\n"); // 將兩個分數相加的顯示 [f1 print];NSLog(@" +");[f2 print]; NSLog(@"----"); fracResult = [f1 newAdd:f2]; [fracResult print]; // id 可以用來儲存屬於任何類的對象 id dataValue; NSLog(@"---------------id類型"); dataValue = f1; [dataValue print]; dataValue = c1; [dataValue print]; //// self.dataValue; //id變數無法使用點運算子// 處理動態類型的方法 if ([dataValue isKindOfClass:[Complex class]])//對象是不是Complex或其子類的成員,繼承層次關係 { NSLog(@"dataValue ‘s SuperClass is %@",[dataValue class]); }; if ([dataValue isMemberOfClass:[Complex class]]){};//對象是不是Complex的成員,直接成員關係 if ([f1 respondsToSelector:@selector(setReal:andImaginary:)]){};//對象是否能夠響應selector所指定的方法 if ([dataValue instancesRespondToSelector:@selector(setReal:andImaginary:)]){};//指定的類執行個體是否能響應selector if ([dataValue isSubclassOfClass:[Complex class]]){};//對象是否是指定類的子類 [dataValue performSelector:@selector(setValue:forKey:)];//應用selector指定的方法 [dataValue performSelector:@selector(setNumberator1:Denominator:) withObject:f1];//使用selector指定的方法,傳遞參數 [dataValue performSelector:@selector(setNumberator1:Denominator:) withObject:f1 withObject:f2]; //使用@try處理異常 Fraction *f = [Fraction new];// [f noSuchMethod]; NSLog(@"Execution continues"); @try {// [f setReal:18.0 andImaginary:2.5]; } @catch (NSException *exception) { NSLog(@"Caught %@%@",[exception name],[exception reason]); } @finally { NSLog(@"Execution continues"); } } return 0;}
//// Fraction.h// OC7類//// Created by Zoujie on 15/8/23.// Copyright (c) 2015年 Zoujie. All rights reserved.//#import <Foundation/Foundation.h>//介面檔案@interface Fraction : NSObject#pragma mark - 屬性 自動產生 Setter && Get@property int numberator1;@property int denominator1;#pragma mark - Setter && Get//-(void)setNumerator:(int)n;//-(void)setDenominator:(int)d;//-(int)numerator;//-(int)denominator;-(double) convertToNum;-(void)print;/** * 多參數函數 */-(void)setNumberator1:(int) n Denominator:(int)d;/** * add */-(void) add:(Fraction *)f;/** * 相約數 */-(void) reduce;/** * 記數 */-(int)showpage;/** * new add */-(Fraction *) newAdd:(Fraction *)f;/** * 減去訊息接受著的參數 */-(Fraction *) subtract :(Fraction *)f;/** * 乘 */-(Fraction *) multiply :(Fraction *) f;/** * 除 */-(Fraction *) divide :(Fraction *)f;@end
//// Fraction.m// OC7類//// Created by Zoujie on 15/8/23.// Copyright (c) 2015年 Zoujie. All rights reserved.//#import "Fraction.h"//雙引號實用於本地檔案(自己建立的檔案),而不是系統檔案//實現檔案 實現部分包含的私人資訊/** * static 關鍵字 局部靜態變數 記錄所有對象調用函數的次數 局部變數 只記錄每個對象自己調用函數的次數 */static int hitCount = 0;//調用次數@implementation Fraction//{// int numberator;// int denominator;//}/** * 如果省略@synthesize指令,那麼編譯器會自動分別命名底層的執行個體變數_numberator1,_denominator1. */@synthesize numberator1,denominator1;//-(void) setNumerator:(int)n//{// numberator = n;//}////-(void) setDenominator:(int)d//{// denominator = d;//}//********setter getter的參數名 不要跟 執行個體名稱 相同 *********-(void)setNumberator:(int)numberator{ numberator1 = numberator;}-(void) setDenominator:(int)denominator{ denominator1 = denominator;}//-(void) setDenominator:(int)denominator //自動產生Setter//{// denominator = denominator;//}-(int)numerator{ return numberator1;}-(int)denominator{ return denominator1;}-(void)print{ NSLog(@"%i/%i",numberator1,denominator1);}-(double)convertToNum{ if (denominator1 != 0) { return (double) numberator1 / denominator1; } else { return NAN; }}-(void)setNumberator1:(int)n Denominator:(int)d{ denominator1 = d; numberator1 = n;}-(void) add:(Fraction *)f{ numberator1 = numberator1 * f.denominator1 +denominator1 *f.numberator1; denominator1 = denominator1 * f.denominator1; // self 關鍵字 當前方法的接受著 [self reduce];}/* * new add */-(Fraction *) newAdd:(Fraction *)f{ Fraction *result = [Fraction new]; result.numberator1 = numberator1 * f.denominator1 + denominator1 * f.numberator1; result.denominator1 = denominator1 * f.denominator1; [result reduce]; return result;}/** * sub */-(Fraction *) subtract:(Fraction *)f{ Fraction *result = [Fraction new]; result.numberator1 = numberator1 * f.denominator1 - denominator1 * f.numberator1; result.denominator1 = denominator1 * f.denominator1; [result reduce]; return result;}-(void) reduce{//局部變數 int u = numberator1; int v = denominator1; int temp; while (v != 0) { temp = u % v; u = v ; v = temp ; } numberator1 /= u; denominator1 /= u;}-(int)showpage{ int hitCount = 0; hitCount ++; return hitCount;}@end
//// Complex.h// OC7類//// Created by Zoujie on 15/8/30.// Copyright (c) 2015年 Zoujie. All rights reserved.///** * 多態,動態類型,動態綁定 * 使不同的類共用相同的方法名稱的能力稱為多態 */#import <Foundation/Foundation.h>@interface Complex : NSObject@property double real,imaginary;-(void)print;-(void)setReal:(double)a andImaginary:(double)b;-(Complex *) add:(Complex *)f;@end
//// Complex.m// OC7類//// Created by Zoujie on 15/8/30.// Copyright (c) 2015年 Zoujie. All rights reserved.//#import "Complex.h"@implementation Complex@synthesize real,imaginary;-(void)print{ NSLog(@"%g + %gi",real,imaginary);}-(void) setReal:(double)a andImaginary:(double)b{ real = a ; imaginary = b;}-(Complex *)add:(Complex *)f{ Complex *result = [[Complex alloc]init]; result.real = f.real+real; result.imaginary = f.imaginary + imaginary; return result; }@end
OC多態,動態類型綁定