我需要能够创建一个像在C#中创建的界面来强制执行一组类来实现某些方法。 这在目标c中是否可行?
答案 0 :(得分:29)
您可以创建协议。它看起来像这样: 在MyProtocol.h中:
@protocol MyProtocol
-(void)myMethod;
-(void)myMethod2;
@end
在MyClass.h中
#import "MyProtocol.h"
@interface MyClass : NSObject<MyProtocol>
@end
如果您想接收给定协议的对象,可以这样做:
id<MyProtocol> var;
或
NSObject<MyProtocol> *var;
更多信息here
答案 1 :(得分:8)
使用
声明“协议”(Objective-C的接口)@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end
其中<BaseProtocol>
是可选的,表示MyProtocol
“继承了”BaseProtocol
的界面。 NSObject
协议在此上下文中很有用,因为它允许您使用
@protocol MyProtocol <NSObject>
//...
@end
表示(在适当的时候)MyProtocol
的符合实例也具有标准NSObject
方法(例如-retain/-release
等)。
然后声明一个类“符合”协议:
@interface MyClass : NSObject <MyProtocol,...,OtherProtocols>
{}
@end
您可以测试实例是否符合协议:
id myInstance = ...; //some object instance
if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
// myInstance conforms to MyProtocol
}
您可以通过声明变量保存符合协议的实例来进一步沉默编译器警告(请注意,Objective-C的动态特性会阻止编译器验证该合同,并且您仍然可以通过分配不合格的实例来获取运行时错误到变量):
id<MyProtocol> o;
在这种情况下,如果您发送[o retain]
而MyProtocol
符合NSObject
协议,则编译器会抱怨。您可以通过将MyProtocol
声明为符合上述NSObject
或将o
视为
NSObject<MyProtocol> o;
由于NSObject
不是Cocoa中唯一的根对象(即NSProxy
不从NSObject
继承),所以符合MyProtocol
的所有实例也不一定正确符合NSObject
。如果您知道他们这样做,您可以声明MyProtocol
符合NSObject
。
答案 2 :(得分:2)
在Objective-C世界中,接口称为“协议”
根据Apple的说法,
Protocols declare methods that can be implemented by any class. Protocols are useful in at least three situations:
To declare methods that others are expected to implement
To declare the interface to an object while concealing its class
To capture similarities among classes that are not hierarchically related
所以,要宣布一个协议,你可以:
@protocol SomeClassProtocol
- (void) do:(int) number something:(id) sender;
- (void) somethingElse;
@end
要实现协议,请执行以下操作:
@interface MyClass : NSObject <Protocol1, Protocol2, ..., ProtocolN>
@end
查看this link以获取官方文档。
答案 3 :(得分:0)
接口在Objective C中称为协议
如果您要在项目中添加一个类,您可以选择将其创建为协议,最终会得到以下内容:
@protocol MyProtocol
-(void) DoSomething;
@end