今天下午沒什麼事,不上班了,課程設計也不急,本來叫人去逛街的,但現在也不想動,算了,那就不去了,那就來爲大家說說objective-c面向對象吧。
我也是初步學objective-c,開這個博客,一方面是爲我學習過程記錄一下,以後需要回顧的時候好找,另外是想爲像我這樣已經有一些其他語言開發經驗的人提供方便,讓大家學起來更加容易,我計劃等我把這塊學完爲這個開個專欄,名字就叫“不從零開始學objective-c”,呵呵``,只是計劃,只是計劃。
以前有很多很多人問我面向對象是怎麼學的,我們學校也開面向對象的課,但大家還是不懂面向對象是怎麼學的,每當同學或者朋友問起我都會淡定的打開高洛峯的《細說php》第二版224頁有這麼一句話:“面向對象這種編程思想是初學者最大的障礙,也是導致很多讀者遠離面向對象程序設計的一個原因,所以請讀者將本章的內容完全掌握之後,再在以後的學習和實踐中不斷積累,慢慢去理解和掌握面向對象程序設計思想吧”;所以面向對象的思想有時候感覺不是學會的,是慢慢品味出來的,有的人不學多長時間,代碼中就處處飄着面向對象的味道,有的人寫了幾年代碼了就仍然是面向過程的代碼編寫方式,我的建議就是先學學面向對象的鼻祖語言java基礎,也就是j2se,建立基本的面向思想,知道面向對象是什麼,起碼讓你去寫一個類能寫出來,完了我建議去學學j2ee,去接觸一下ssh框架,去看看java的設計模式,java的設計模式在ssh中體現的淋漓盡致,假如你學了ssh,你一定會感覺android是個小菜,我是先學的android,後來學校開了j2ee課接觸了一下,並不是很熟,但能感覺出那真的很強大,在那裏我更深刻的體會了工廠模式,單例模式,面向對象編程,面向接口編程,面向切面編程等等,思想覺悟提高不少,後來在外面做兼職,主要做android應用,就把好多j2ee的思想加了進去,後來做php的課程設計,我仍然使用面向對象,在php中加入了工廠模式還有j2ee的分層架構,感覺代碼結構挺好的,這套方法後來也被好好同學學了去。
說這麼多,主要是告訴大家,思想是得在實踐中慢慢鍛煉出來的,所以這不是一個可以急得事,慢慢來,相信我們都可以學好。
不說廢話了,開始我們第一個面向對象的程序,我還用以前寫的代碼來講:
#import <Foundation/Foundation.h>
@interface Fraction:NSObject
-(void) print;
-(void) clear;
-(void) setReuslt:(double) s;
-(void) add:(double) a;
-(void) substract:(double) s;
-(void) multipy:(double) m;
-(void) divide:(double) d;
@end
@implementation Fraction
{
double result;
}
-(void) print{
NSLog(@"%g",result);
}
-(void) clear{
result = 0.0;
}
-(void) setReuslt:(double) s{
result = s;
}
-(void) add:(double)a{
result += a;
}
-(void) substract:(double)s{
result -=s;
}
-(void) multipy:(double)m{
result *= m;
}
-(void) divide:(double)d{
result /= d;
}
@end
int main(int argc,const char * argv[])
{
@autoreleasepool {
double a;
scanf("%lg",&a);
Fraction *fraction = [[Fractionalloc] init];
[fractionsetReuslt:a];
[fractionadd:3];
[fractionprint];
[fractionsubstract:3];
[fractionprint];
[fractionmultipy:3];
[fractionprint];
[fractiondivide:3];
[fractionprint];
}
return 0;
}
這段代碼可以分爲三部分,interface/implemention/main
先說main部分,main部分就是main函數部分,這裏的作用我就不細說了,程序的入口,等等說了另外兩個部分,我來說說main中代碼的意思
再說interface部分,我把這部分代碼說一下,看下面註釋
/*這是interface的開頭,這部分可以在面向接口編程中叫做接口部分,也可以叫做聲明部分,以@interface開頭,@end結束,Fraction爲類名,NSObject爲父類名,objectve-c的祖宗類就是這玩意,它就好比java中的object類一樣*/
@interface Fraction:NSObject
/*這是方法的聲明,“-”代表這是對象級別的方法,(void)是該方法的返回值類型,print是方法名,要是有形參就看setResult方法那樣“:(double) s”冒號後面是參數,(double)是型參的類型,a是形參名*/
-(void) print;
-(void) clear;
-(void) setReuslt:(double) s;
-(void) add:(double) a;
-(void) substract:(double) s;
-(void) multipy:(double) m;
-(void) divide:(double) d;
//這裏結束
@end
下面看看implemention部分
/*這部分可以叫做實現部分,以@implementation開頭,@end結束,Fraction是類名這個得和interface部分類名相同,這是在一個文件裏面寫着將來把類放在單獨文件中,這些會自動生成*/
@implementation Fraction
//這裏面定義全局變量,這裏定義的變量都是私有變量,將來在類外面訪問需要爲這個變量提供訪問方法,這些方法將來也可以自動生成,這裏體現了良好的封裝性
{
double result;
}
//下面是對interface中方法的實現,可以不全部實現
-(void) print{
NSLog(@"%g",result);
}
-(void) clear{
result = 0.0;
}
-(void) setReuslt:(double) s{
result = s;
}
-(void) add:(double)a{
result += a;
}
-(void) substract:(double)s{
result -=s;
}
-(void) multipy:(double)m{
result *= m;
}
-(void) divide:(double)d{
result /= d;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
double a;
scanf("%lg",&a);
//這是生成該類對象,這句話可以分爲三部分
//Fraction *fraction; 聲明變量
//fraction = [Fraction alloc]; 爲該對象分配內存(c語言的方式)
//fraction = [fraction init]; 初始化該對象
Fraction *fraction = [[Fraction alloc] init];
//調用方法,objective-c中方法調用都是[],後面會說到"."的調用方法,但是推薦[]
[fraction setReuslt:a];
[fraction add:3];
[fraction print];
[fraction substract:3];
[fraction print];
[fraction multipy:3];
[fraction print];
[fraction divide:3];
[fraction print];
}
return 0;
}
其實沒說多少東西,希望對大家有幫助,如果有什麼問題,歡迎留言