本節(jié)用一簡短的文章來說下是ObjectiveC中的類。類其實是OOP中的一個概念,概念上簡單來講類是它是一組關系密切屬性的集合,所謂的關系就是對現(xiàn)實事物的抽象。
- 上面提到的關系包括很多種,比如has a, is a,has some等;
- 關系是一種抽象過程,源于對事務的理解,同時還要平衡開發(fā)的成本,這是一門藝術;
類的結構
OOP標準結構
下圖是一張通用的類完整結構圖表示,本章暫時只講最基礎的部分,后續(xù)章節(jié)會圍繞這個基礎逐漸深入展開。
幾點需要說明下:
- 在OOP世界中,所有的類都有一個默認的父類,一般稱為基類。比如java里的基類名為Object,ObjectiveC中的基類名稱為NSObject。
- OOP中不允許多繼承,ObjC也不例外;
- 協(xié)議可以實現(xiàn)多個,即一個類可以實現(xiàn)多種不同的協(xié)議;
OOP在ObjC中的實現(xiàn)
ObjectiveC中的代碼實現(xiàn)模式:
幾點需要說明下:
- 在ObjectiveC中,會把一個類拆分成兩個文件接口(.h)和實現(xiàn)(.m)。
- ObjectiveC中的文件只是一個載體,具體的定義是由關鍵標識來定義的,比如在一個.h文件中可以定義多個接口定義;在一個.m文件中也可以定義多個接口的實現(xiàn)
在同一個.m文件中書寫全部的代碼,這種方式并不推薦,因為會給維護帶來很大問題。
#import <Foundation/Foundation.h>
// ----------------------類聲明----------------------------
@interface Fraction : NSObject
@end // Tire
// -----------------------類實現(xiàn)---------------------------
@implementation Fraction
- (NSString *) description
{
return (@"I am a tire. I last a while");
} // description
@end // Tire
// -----------------------main入口函數(shù)---------------------------
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fraction *engine = [Fraction new];
}
return 0;
}// main
所以推薦的類組織方式是:
分離接口和實現(xiàn)
把@interface和@implementation代碼定義在同一個.m文件中,這種方式呢做練習用還可以,如果是正式的程序就不太方便了。因為這樣的話在代碼行數(shù)比較多時維護會是個大總是,所以最好的方法是分離接口和實現(xiàn),實現(xiàn)分而治之,如下:
創(chuàng)建類文件
使用XCode工具,在“New File時”選擇Cocoa class創(chuàng)建文件時會自動分離.h和.m,如下圖所示:
在下一步窗口中添填寫新創(chuàng)建的類名稱,也可以選擇需要繼承的父類(父類可以是自定義的類):
最后設置文件存放目錄,也可以設置目標和群組,復雜的項目可以有多個組和目標:
- Group:Group主要是用于管理項目的源文件,比如可以創(chuàng)建兩個Group,一個用于存放UI文件,一個用于存放處理程序類。Group不是java中package的概念,它是XCode的一個邏輯分組并不會真正的移動文件位置,甚至可以讓Group指向磁盤上某個特定的文件夾;
- Target:簡單可理解應用編譯后的運行環(huán)境,比如一個IOS程序,其可以設置多個不同的目標如iphone12、iphone13等,每個目標采用不同的配置,這樣也比較方便測試其兼容性;
.h類聲明實現(xiàn)
相當于類功能的描述,默認格式上文件名與類名相同。在.h文件中一般用于定義類的@interface指令、公共的struct定義、enum常量、#defines和extern全局變量。新創(chuàng)建一個Fraction.h文件,代碼示例如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
-(void) print;
@end //end Fraction
.m類功能實現(xiàn)
相當于類功能的實現(xiàn),默認格式上文件名與類名相同。在.m一般用于定義類的@implementation指令、私有的struct定義、extern全局變量定義。新創(chuàng)建一個Fraction.m文件
如果創(chuàng)建的是以.mm為后綴的文件則可以同時使用C++和ObjectiveC語法,示例代碼如下:
#import "Fraction.h"
@implementation Fraction {//私有屬性
int numerator;
int denominator;
}
- (void) print {
NSLog(@"%i / %i", numerator, denominator);
}
- (void) setNumerator:(int) n {
numerator = n;
}
- (void) setDenominator:(int) d {
denominator = d;
}
@end
分離后的代碼會有如下特點:
- 在@interface中引入的頭文件,可直接繼承到@implementation實現(xiàn)中不必重復導入,比如在.h文件中import <Foundation/Foundation.h>,則.m文件中就不需要再寫一遍了(雖然可以);
- 在 @implementation 實現(xiàn)中也可以定義 @interface 中未出現(xiàn)過的方法和變量,但要注意不要和.h文件中定義的變量名重復;
- 在@implementation或@interface中定義的方法的參數(shù)名稱盡量不要和自定義的變量重名,所以給變量前面加上self是一個非常好的習慣,比如下列代碼;
//聲明部分
-(void) setNumerator: (int) name;
//實現(xiàn)部分
NSString *name;
- (void) setDenominator:(int) name {
name = name;
//上面這行代碼必須替換為如下代碼,否則會發(fā)生錯誤
self.name = name;
}
類的實例化
類可以通過new或alloc關鍵字實現(xiàn)實例化,類的實例化是一大塊內(nèi)容,本節(jié)只需簡單了解其使用調(diào)用,如果用XCode創(chuàng)建工程,則會默認生成一個名為main.m的文件,里面包含一個main方法(注意:一個工程只允許存在一個main()方法)。文章來源:http://www.zghlxwxcb.cn/news/detail-845881.html
// -----------------------main入口函數(shù)---------------------------
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fraction *engine = [[Fraction alloc] init];
}
return 0;
}
類的組合
上述就是最簡單類的實現(xiàn),下面看到類封裝的基本用法。也是一種最簡單的設計模式組合。比如描述一輛汽車:
對象組合其實是一種設計思想,并不是一種技術框架實現(xiàn)。類的擴展有分類和協(xié)議兩種技術,另一種技術就是合成對象,它可以定義一個類包含其他類的一個或多個對象,這個新類就是所謂的合成對象。即手動處理,比如父子類的實現(xiàn)可修改成如下代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-845881.html
@interface Car: NSObject{
Tires *tires[4]; //4條輪胎
Engine *engine; //1個引擎
}
@interface Tires: NSObject{
int par; //標準的氣壓值
int position;//安裝位置
}
@interface Engine: NSObject{
NSString *name; //引擎名稱
}
到了這里,關于ObjectiveC-08-OOP面向對象程序設計-類的分離與組合的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!