gpt4 book ai didi

.net - API 设计中的异步抽象方法和派生类

转载 作者:行者123 更新时间:2023-12-01 04:58:13 26 4
gpt4 key购买 nike

我有一个 抽象类 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 中遇到的错误: enter image description here

这是抽象类中方法的签名:

enter image description here

最佳答案

你当然可以这样做:

await doer.DoItAsync();

理解的关键是types是可等待的,而不是methods。你可以做 await doer.DoItAsync() 因为 DoItAsync 返回一个 Task,而不是因为 DoItAsync异步。我在我的 async intro post 中有更多解释。 .

换句话说,该代码与以下代码完全相同:

Task temp = doer.DoItAsync();
await temp;

我有一个 "async OOP" series在我的博客上;其中一篇文章涵盖了async in inheritance scenarios .

关于.net - API 设计中的异步抽象方法和派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352411/

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