在obj-c的世界中,官方根本没有"接口"与"泛型"这样的说法。
不过在obj-c中有二个与之接近的概念" 非正式协议(interface)"与" 正式协议(protocal)"。 非正式协议在obj-c中的关键字虽然也是interface,但是这个跟c#中的接口(interface)并不完全相同。
#import <Foundation/Foundation.h>
@interface Sample : NSObject {
}
-(void) HelloWorld;
@end
@protocol IQuery
-(void) Query:(NSString*) sql;
@end
#import <Foundation/Foundation.h>
#import "IQuery.h"
@interface DBQuery : NSObject<IQuery> {
}
@end
#import "DBQuery.h"
@implementation DBQuery
-(void) Query:(NSString *)sql
{
NSLog(@"Query is called. sql:%@",sql);
}
@end
@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#中泛型的效果(注:只是形似,并非神似)
#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) 长得很像?
出处: http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。