我想使用委托设计模式将一些任务分配给子对象,一旦完成它就必须告诉我,以便我可以采取相应的行动。
但是在Objective c中,可以使用Protocols轻松完成。
我知道协议等价是C#中的接口但是我找不到任何关于如何在c#中进行委托的例子我知道我们必须将子对象声明为弱,否则将发生循环引用。
如果有任何其他替代方法可以在c#中进行AFAIK授权
使用代码段进行解释将是一个好主意
答案 0 :(得分:4)
注意:在这里混合C#和Obj-C术语,ObjC用斜体(我希望......; - )
我们创建了一个接口,用于定义用户将实现的协议方法,以扩展另一个接受此协议的类的功能作为代表:
public interface IWorkerDelegate
{
void PreformAdditionalWork();
}
在此示例中存储为弱引用,因此请保留对您指定的代理的强引用...
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();
});
}
}
public class AdditionalWorkerDelegate : IWorkerDelegate
{
public void PreformAdditionalWork()
{
Console.WriteLine("IWorkerDelegate.PreformAdditionalWork");
}
}
var worker = new Worker();
await worker.DoAlotOfWork();
worker.WorkerDelegate = new AdditionalWorkerDelegate();
await worker.DoAlotOfWork();
Worker.DoAlotOfWork
Worker.DoAlotOfWork
IWorkerDelegate.PreformAdditionalWork