【问题标题】:How to access a abstract undefined function from abstract class in c#?如何从 C# 中的抽象类访问抽象的未定义函数?
【发布时间】:2019-01-18 07:25:25
【问题描述】:

我该怎么做?

public abstract class A {

    protected abstract async Task foo(int a);

    protected async Task bar(int a) {
        await foo(a);
    }
}

public class B : A {
    public async Task foo(int a) {
        return a + 1;
    }
}

基本上我想在抽象类中声明一个没有主体的异步函数,也让抽象类中的另一个函数像它存在一样使用该函数。但是在实现抽象类的类中使用主体定义该函数。

注意:我的代码中的foo 有一些使用等待的东西,所以它必须是异步的。

这可能吗?

【问题讨论】:

  • 我看不出这个问题是如何回答我的问题的?
  • @servy 这个和您链接到的问题都在同一个域中,它们不是彼此重复的。您链接的问题主要是关于您在异步函数中不使用 await 时收到的编译器警告。这更多是关于首先定义它。该问题的公认答案不会帮助该用户。
  • 异步与方法声明的其他部分不同。你不能强迫某些东西是异步的。您所能做的就是将返回类型指定为Task
  • Sam I am 下面的回答是正确的。只需去掉抽象声明中的 async 即可。

标签: c#


【解决方案1】:

不要在抽象类中创建foo async。只要它返回Task,您仍然可以使用async 实现覆盖它。

您需要考虑的其他事项:

  • 您需要在foo 函数中的override 关键字B
  • 如果要返回一个int,它需要是Task<int>
  • 它们要么都必须受到保护,要么都必须公开。你不能让一个受保护而另一个公开。

【讨论】:

  • 对不起 - 你是对的 - 我对公共与内部类声明感到困惑
【解决方案2】:

您缺少覆盖关键字:

public abstract class A {

    public abstract Task<int> foo(int a);

    protected async Task bar(int a) {
        await foo(a);
    }
}

public class B : A {
    public override async Task<int> foo(int a) {
        return a + 1;
    }
}

【讨论】:

  • 无法编译
  • 将方法从受保护更改为公开。
  • 仍然无法编译
  • 仍然无法编译
  • 从方法中移除异步
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2017-12-16
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多