gpt4 book ai didi

c# - xamarin 中等效于 Objective C 的协议(protocol)代表

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:40 25 4
gpt4 key购买 nike

我想使用委托(delegate)设计模式将一些任务分配给子对象,一旦完成,它必须让我知道,以便我可以采取相应的行动。

但在 Objective c 中可以使用协议(protocol)轻松完成。

我知道协议(protocol)等价物是 C# 中的接口(interface),但我找不到任何有关如何在 C# 中进行委托(delegate)的示例,我知道我们必须将子对象声明为弱对象,否则将发生循环引用。

AFAIK 委托(delegate)在 c# 中是不可能的,如果有任何其他替代方案可以实现这一点

用代码片段解释是个好主意

最佳答案

注意:此处混合了 C# 和 Obj-C 术语,ObjC 为斜体(我希望...;-)

我们创建了一个定义协议(protocol)方法的接口(interface),用户可以实现该方法来扩展另一个接受此协议(protocol)作为的类的功能代表:

协议(protocol):

public interface IWorkerDelegate
{
void PreformAdditionalWork();
}

接受协议(protocol)的类:

在此示例中存储为弱引用,因此对您分配的委托(delegate)持有强引用...

public class Worker
{
WeakReference<IWorkerDelegate> _workerDelegate;

public IWorkerDelegate WorkerDelegate
{
get
{
IWorkerDelegate workerDelegate;
return _workerDelegate.TryGetTarget(out workerDelegate) ? workerDelegate : null;
}
set
{
_workerDelegate = new WeakReference<IWorkerDelegate>(value);
}
}

public async Task DoAlotOfWork()
{
// Do some work and continue with a delegate if assigned....
await Task.Run(() =>
{
Console.WriteLine("Worker.DoAlotOfWork");
})
.ContinueWith((Task task) =>
{
if (_workerDelegate != null)
WorkerDelegate?.PreformAdditionalWork();
});
}
}

协议(protocol)的实现:

public class AdditionalWorkerDelegate : IWorkerDelegate
{
public void PreformAdditionalWork()
{
Console.WriteLine("IWorkerDelegate.PreformAdditionalWork");
}
}

委托(delegate)使用模式:

var worker = new Worker();
await worker.DoAlotOfWork();
worker.WorkerDelegate = new AdditionalWorkerDelegate();
await worker.DoAlotOfWork();

输出:

Worker.DoAlotOfWork
Worker.DoAlotOfWork
IWorkerDelegate.PreformAdditionalWork

关于c# - xamarin 中等效于 Objective C 的协议(protocol)代表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736888/

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