【问题标题】:Can one specify a Dart interface that may be implemented by classes with either sync or async methods?可以指定一个 Dart 接口,该接口可以由具有同步或异步方法的类实现吗?
【发布时间】:2015-05-01 15:50:48
【问题描述】:

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

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

【问题讨论】:

标签: dart


【解决方案1】:

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

return new Future.value(someReturnValue);

【讨论】:

  • @Gunter:我会试试这个。然而,这意味着“异步”注释需要对签名(返回值的类型)进行根本的更改,而不仅仅是 Gilad Bracha 的文章“Dart 语言异步支持:第 1 阶段”中所述的实现细节。跨度>
  • 起初我也很难理解这些陈述。您无法将同步函数与带有 async 修饰符的函数进行比较。仅当您有一个返回未来的函数时,从调用者的角度来看,是否将 async 修饰符添加到该函数并不重要。 async 修饰符仍然不能使异步函数同步,它只允许在主体中使用 await。
  • @wjohnson 是的,没有线程,一旦你异步了,你就不能回去了。但这不是因为 async/await 语法,如果您也使用期货和流(或者即使您使用节点中的延续传递样式)也会出现同样的问题。 async/await 糖实际上只是期货和流的糖,它不会改变签名。从代码中删除异步调用的唯一方法是通过阻塞调用和线程。 Dart 团队目前正在一个名为 fetch 的实验性 VM 中对此进行试验。 github.com/dart-lang/fletch/wiki/Coroutines-and-Threads
  • @Greg:有用的评论。我正在尝试在事件驱动的架构中使用协程或 fork/join 结构,这让我深陷其中。我发现自己同意您引用的 Fletch 网站上引用的论文 (Behren+) 的作者的许多观察。当回调在请求/响应中反复出现时,理解应用程序中的控制流变得更加困难。
  • 干杯 ;) 您是否有机会阅读来自 Dart 开发人员之一的早期链接。它专门讨论了同步/异步分裂。 journal.stuffwithstuff.com/2015/02/01/… 我很期待 Fletch 的发展方向。到目前为止,DartVM 的开发一直基于久经考验的旧想法。弗莱奇是一个有趣的离开。尽管这些想法仍然很陈旧,但这些并发模型并不是一条很好的路径。所以从计算机科学的角度来看它更有趣;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2016-01-01
  • 2011-02-22
  • 2012-11-23
相关资源
最近更新 更多