我需要编写一个虚拟基类。
public virtual int LoadData()
{
return 0;
}
并且需要使用await调用来编写覆盖。
public override async Task<int> LoadData()
{
await Task.Delay(200)
return 1;
}
如何实施?
答案 0 :(得分:4)
在您的基类中,您只需实现LoadDataAsync
方法:
public virtual int LoadData()
{
return 0;
}
public async Task<int> LoadDataAsync()
{
return await Task.Run(() => LoadData());
}
这使您可以自由地覆盖继承类中的LoadData
方法,而无需实现异步方法。
public override int LoadData()
{
return 69;
}
答案 1 :(得分:3)
简直不可能。当您要覆盖方法时,子方法应具有确切的名称,参数类型(和顺序)以及返回类型作为父方法。虽然,你想要做的是覆盖int LoadData()
Task<int> LoadData()
,这是完全错误的(无论async
关键字在这里无关),因为你有两种不同的返回类型。因此,如果您可以访问父代的源代码,则必须更改您的设计。例如,可能的设计之一可能是这样的:
// parent:
public virtual Task<int> LoadData()
{
return Task.FromResult(0);
}
// child
public override async Task<int> LoadData()
{
await Task.Delay(200)
return 1;
}
或者这个:
// parent:
public virtual int LoadData()
{
return 0;
}
public virtual Task<int> LoadDataAsync()
{
return Task.Run(() => LoadData());
// or implement it awaitable; whatever you need, there is no difference.
}
// child
public override int LoadData()
{
return 0;
}
public override async Task<int> LoadDataAsync()
{
await Task.Delay(200); // or don't await it; just return the Task. whatever is your requirement.
return 1;
}