可以指定一个Dart接口,该接口可以由使用同步或异步方法的类实现吗?

可以指定一个Dart接口,该接口可以由使用同步或异步方法的类实现吗?,dart,Dart,对于使用远程服务的Dart组件,我首先将Dart服务接口定义为一个抽象类(例如,抽象类XService)和一个模拟类(类XServiceMock实现XService),并使用同步方法实现我用于测试组件的服务API。我现在开始实现真正的代理(类XServiceImpl实现XService),它的一些方法使用“wait/async”语言特性。“await”要求使用async对包含的方法进行注释,async要求返回类型为Future,并使其与XService中的方法签名冲突。我希望能够在不修改组件源代

对于使用远程服务的Dart组件,我首先将Dart服务接口定义为一个抽象类(例如,抽象类XService)和一个模拟类(类XServiceMock实现XService),并使用同步方法实现我用于测试组件的服务API。我现在开始实现真正的代理(类XServiceImpl实现XService),它的一些方法使用“wait/async”语言特性。“await”要求使用async对包含的方法进行注释,async要求返回类型为Future,并使其与XService中的方法签名冲突。我希望能够在不修改组件源代码的情况下注入模拟代理或真实代理。这能做到吗?如何做到

XService (api)
XServiceMock implements XService (sync methods only)
XServiceImpl implements XService (mixture of async and sync methods)

这是不可能的。您可以做的是指定一个异步接口并从同步代码返回未来

返回新的Future.value(someReturnValue);

@Gunter:我试试这个。然而,这意味着“异步”注释需要对签名(返回值的类型)进行根本性的更改,而不仅仅是Gilad Bracha的文章“Dart语言异步支持:阶段1”中所述的实现细节。起初我在理解这些语句时也遇到了困难。不能将同步函数与带有异步修饰符的函数进行比较。仅当您有一个返回未来的函数时,无论您是否从调用方的角度将异步修饰符添加到该函数,这都无关紧要。async修饰符仍然不能使异步函数同步,它只允许在正文中使用wait。@是的,没有线程,一旦异步,就不能返回。但这并不是因为async/await语法,如果您也使用futures和streams(或者即使您使用类似于node的continuation传递样式),也会出现同样的问题。async/await sugar实际上只是期货和流的糖,它不会更改签名。从代码中删除异步调用的唯一方法是阻塞调用和线程。Dart团队目前正在一个名为fletch的实验虚拟机上进行这方面的实验@格雷格:有用的评论。我正试图在事件驱动的体系结构中实现协同路由或fork/join结构,这一点让我感到很沮丧。我发现自己同意你引用的Fletch网站上引用的论文作者(Behren+)的许多观察结果。当回调在请求/响应中反复出现时,理解应用程序中的控制流就变得更加困难。Cheers;)您是否有机会阅读Dart开发人员提供的早期链接。它专门讨论了同步/异步分裂。我很期待fletch的进展。到目前为止,DartVM的开发都是基于久经考验的老想法。弗莱奇是一个有趣的离开。尽管这些想法仍然陈旧,但这些并发模型并不是一条很好的道路。因此,从计算机科学的角度来看,它更有趣;)