gpt4 book ai didi

c# - 等同于 C# 中的协议(protocol)和委托(delegate)

转载 作者:可可西里 更新时间:2023-11-01 05:44:48 26 4
gpt4 key购买 nike

我想知道,C# 中协议(protocol)和委托(delegate)的等价物。

所以这是我的协议(protocol),定义协议(protocol)的类的接口(interface)和实现以及符合协议(protocol)的类的实现。我想知道这在 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
}

最佳答案

协议(protocol)的直接等价物是接口(interface)。由于 obj-c 委托(delegate)不是一种语言功能,而只是一种设计概念,因此 C# 中没有等效项。

此外,我强烈建议不要在 obj-c 和 C# 之间重用对象模型。即使使用像您的示例这样的后端代码。语言差异太大。对于像您的示例这样的任务,我会考虑以下备选方案:

  1. 使用 2 个 C# 事件而不是 2 个委托(delegate)方法。

  2. 使用以下原型(prototype)作为您的通信方法:void Communicate( Action<YourData> actionToRunOnData ) ,在成功时调用操作,并在失败时抛出异常。仅供引用:Action<YourData> actionToRunOnData相当于void(^)(YourData*)actionToRunOnData在 obj-c 中阻止。

  3. (我通常更喜欢这个)使用以下原型(prototype)作为您的通信方法:async Task<YourData> Communicate() ,并在失败时抛出异常。

附言趣闻:在 C# 术语中,类似 Action<YourData> actionToRunOnData 的东西称为“委托(delegate)”——与 obj-c 委托(delegate)没有任何共同之处。

关于c# - 等同于 C# 中的协议(protocol)和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com