我有一个抽象类 MyAbstractDoerClass,它有一个名为DoItAsync的抽象方法,如下所示:
public class MyAbtractDoerClass
{
public abstract Task DoItAsync();
}
它还有几个派生类PainterClass和EraserClass:
public class PainterClass : MyAbtractDoerClass
{
public override async Task DoItAsync();
}
public class EraserClass : MyAbtractDoerClass
{
public override async Task DoItAsync();
}
最后,有一个Factory方法返回这两个类中任何一个的实例。签名是这样的:
public MyAbstractClass Factory(string doerType)
现在,我的代码如下所示:
var doer = Factory("painter");
await doer.DoItAsync(); // <--- here is the problem.
鉴于MyAbstractClass.DoItAsync方法是一个抽象方法,它不能被标记为异步,因此我不能在API客户端中使用await关键字。这使我的API可用性看起来非常糟糕。我怀疑我的设计有些不对劲,有些概念我并不完全理解,但我不知道是什么。
我的代码出了什么问题?
更新
这是我在VS中遇到的错误:
这是抽象类中方法的签名:
答案 0 :(得分:9)
你当然可以这样做:
await doer.DoItAsync();
理解的关键是类型是等待的,而不是方法。您可以执行await doer.DoItAsync()
,因为DoItAsync
会返回Task
,而不是因为DoItAsync
是async
。我在async
intro post中解释了这一点。
换句话说,该代码完全相同:
Task temp = doer.DoItAsync();
await temp;
我的博客上有"async
OOP" series;其中一个帖子涵盖async
in inheritance scenarios。