不過在obj-c中有二個與之接近的概念"非正式協議(interface)"與"正式協議(protocal)"。非正式協議在obj-c中的關鍵字雖然也是interface,但是這個跟c#中的接口(interface)並不完全相同。
1
2
3
4
5
6
7
8
9
|
#import
<Foundation/Foundation.h> @interface Sample
: NSObject { } -( void )
HelloWorld; @end |
1
2
3
4
5
|
@protocol IQuery -( void )
Query:( NSString *)
sql; @end |
1
2
3
4
5
6
7
8
|
#import
<Foundation/Foundation.h> #import
"IQuery.h" @interface DBQuery
: NSObject <IQuery>
{ } @end |
1
2
3
4
5
6
7
8
9
10
|
#import
"DBQuery.h" @implementation DBQuery -( void )
Query:( NSString *)sql { NSLog (@ "Query
is called. sql:%@" ,sql); } @end |
1
2
3
4
5
6
7
8
9
|
@protocol IQuery @required -( void )
Query:( NSString *)
sql; @optional -( void )
HelloWorld; @end |
有了@optional關鍵字以後,其實“非正式協議”在語義上完全可以被“正式協議”所取代,事實上Cocoa中的非正式協議都在逐漸被標有@optional方法的正式協議所代替。
如果你在XCode的代碼中,選中NSObject,右擊-->Jump to Definition,會發現NSObject其實就是一個interface或protocal
選擇protocal NSObject 繼續,會看到NSObject.h文件中關於protocal NSObject的定義
同樣的,你還可以看到interface NSObject的定義
從這裏可以看到,非正式協議的interface NSObject其實最終採用的還是正式協議protocal NSObject.
也就是說,在obj-c的OO世界中,身爲萬物之祖的NSObject其實也就一個"正式協議”,所以從NSObject派生出的所有類,都只是在遵守一個或多個協議而已。
另一個話題泛型
在obj-c中,一切皆爲指針。前面的學習中,我們已經接觸到了一種特殊的類型id,它可以認爲是一種特殊的指針:可以指向任何類型的對象。id 再加上正式協議,能夠達到形似c#中泛型的效果(注:只是形似,並非神似)
1
2
3
4
5
6
7
8
9
|
#import
<Foundation/Foundation.h> #import
"IQuery.h" @interface DBQuery
: NSObject <IQuery>
{ } -( void )
test:( id <IQuery>)
obj; @end |
注意這裏的 -(void) test:(id<IQuery>) obj; 這表明test方法接受一個任意類型的對象做爲參數,但是該參數對象必須實現接口IQuery(也可以說成該參數對象必須採用正式協議IQuery),是不是跟c#中的
void test(List<IQuery> obj) 長得很象?