在C#中,协议和委托的等效物是什么?

4

我希望了解在C#中,协议和委托的等效方法。

这是我的协议,包括定义协议的接口和类的实现,以及符合协议的类的实现。我想知道在C#中的等效方法,请帮忙解答 :)

/******************************************/
// Communicator Protocol
@class Communicator

@protocol CommunicatorDelegate <NSObject>

@required
- (void)communicator:(Communicator *)communicator receivedData:(NSData *)data;
- (void)fetchingFailedWithError:(NSError *)error;

@optional
- (void)anOptinalMethod;

@end

/******************************************/
// Communicator Class

@protocol CommunicatorDelegate;

@interface Communicator : NSObject

@property (weak, nonatomic) id<CommunicatorDelegate> delegate;

@end

/******************************************/
// Communicator Implementation

@implementation

-(void)someMethodThatFail:(NSError *)error;
{
    [self.delegate fetchingFailedWithError:error];
}

- (void)someMethodThatGetData:(NSData *)data;
{
    [self.delegate communicator:self receivedData:data];
}

@end

/******************************************/
// Interface of Some Class that conform with the protocol

#import "Communicator.h"

@interface SomeClass : NSObject <CommunicatorDelegate>

@end

/******************************************/
// Implementation of Some Class that conform with the protocol

- (void)communicator:(Communicator *)communicator receivedData:(NSData *)data;
{
    // Do something
}

- (void)fetchingFailedWithError:(NSError *)error;
{
    // Do something
}

对于不熟悉Objective-C的人来说,协议和委托在该语言中有什么作用? - Matthew
1个回答

3
协议的直接等价物是接口。 由于 obj-c 委托不是语言特性,而仅仅是一种设计概念,因此在 C# 中没有对应物。 同时,我强烈建议不要在 obj-c 和 C# 之间重用对象模型,即使像你的例子中那样使用后端代码。这两种语言差异太大了。 对于像你的例子这样的任务,我考虑以下替代方案之一: 1. 使用 2 个 C# 事件来代替你的 2 个委托方法。 2. 使用以下通信方法原型:void Communicate( Action<YourData> actionToRunOnData ),在成功时调用该操作,在失败时抛出异常。FYI:Action<YourData> actionToRunOnData 是 obj-c 中 void(^)(YourData*)actionToRunOnData 块的等价物。 3. (我通常更喜欢这种方法)使用以下通信方法原型:async Task<YourData> Communicate(),在失败时抛出异常。
P.S. 有趣的事实:在 C# 的术语中,诸如 Action<YourData> actionToRunOnData 这样的东西被称为“委托”——与 obj-c 的委托毫无关系。

所以这有点像Objective C中的块...我的意思是动作处理程序或完成处理程序。 - Shiva
如果您能够附上一小段代码片段,那将会非常有帮助。 - Shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接