当前位置: 首页 > 知识库问答 >
问题:

无法隐藏继承的成员编译器错误

温亮
2023-03-14

我正努力做:

public abstract class Base
{
    public abstract Task Execute(); 
}

public abstract class Concrete<T> : Base where T : class
{
    new public abstract Task<T> Execute();
}

但由于某种原因,我得到了编译器错误:

CS0533'混凝土。Execute()'隐藏继承的抽象成员'程序。基础执行()

我在过去隐藏了很多成员,但从来没有遇到过这种情况,我在这里很困惑。在MSDN和web上花了很长时间,但找不到有关此行为的任何信息。

我真的非常感谢你对这个问题的任何见解。

这是小提琴。

共有2个答案

朱鹏
2023-03-14

从MSDN:

抽象方法声明引入了一个新的虚拟方法,但不提供该方法的实现。相反,非抽象派生类需要通过重写该方法来提供它们自己的实现

这个错误的原因是抽象在C#中是如何工作的,抽象可以被继承,可以被实现,但不能被隐藏或被另一个抽象所取代。

此外,考虑代码:

public abstract class Base
{
    public abstract Task Execute();
    public abstract Task<int> Execute();
}

这不会编译,因为:

类型“Base”已使用相同的参数类型定义了名为“Execute”的成员

那么,当我们将第二个方法移动到派生的抽象类时,为什么它会起作用呢?

胡泓
2023-03-14

问题是基本方法是抽象。继承自具体的类

如果Base是一个接口,您可以通过使用显式接口实现来解决这个问题。但是没有什么比显式基类实现更好的了,所以我不认为有任何方法可以获得这种代码,至少在不重命名这两个方法之一的情况下是这样的。

 类似资料:
  • 问题内容: 我在使用webstorm打字稿编译器时遇到问题。我有以下课程 因此,键入“ super”,我会在智能感知中看到所有rootData公共方法。但是在设置super.insert()之后,出现以下错误: TS2340:仅可通过’super’关键字访问基类的公共和受保护的方法 在TS游乐场中尝试过,它正在工作(认为是简化版本)。 谢谢你的帮助。 编辑:检查编译的javascript后,超级方

  • 问题内容: 假设我有以下课程: 以及这两个子类: 和 我的问题是这两个子类从父类共享相同的静态curID成员,而不是拥有不同的成员。 所以,如果我这样做: r1,r2,r3的ID为0,1,2,而t1,t2,t3的ID为3,4,5。除了这些,我希望t1,t2,t3的值分别为0、1、2,即使用curID静态变量的另一个副本。 这可能吗?如何? 问题答案: 正如其他人已经写过的,静态成员已绑定到该类,因

  • 问题内容: 有人告诉我,对于Java子类,它可以继承其超类的所有成员。那么这是否意味着甚至私人成员?我知道它可以继承受保护的成员。 谁可以给我解释一下这个。我现在很困惑。 问题答案: 不,私有成员 不会被继承, 因为私有成员的范围 仅限 于定义它的类。仅公共成员和受保护成员被继承。 从, 超类私人成员 子类 不继承 其父类 的私有成员 。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则

  • 当我在vscode的集成终端中运行java程序时,完整的java路径显示为一大框文本。有没有什么办法可以把它带走? /library/java/javavirtualmachines/jdk-13.0.1.jdk/contents/home/bin/java--enable-preview-dfile.encoding=utf-8-cp“/users/myusername/library/appl

  • 也许有一个 选项,但我还没有找到它。 当直接运行并打印错误时,在消息的第一行之后,它会显示受影响的源代码行,并在下一行使用指向错误位置的插入符号。它看起来像这样: 注意那些直接指向我拼错类型名的行。< code > maven-compiler-plugin 显示如下: 请注意,它去掉了实际指向错误的行。(这是使用甲骨文JDK 7。) 好的,所以起初我认为这个较旧的问题会有答案,因为它也是关于没有

  • TL;DR 我引用的旧代码不符合 C 语言。令人惊讶的是,代码曾经有效。不能在构造函数和解构函数中调用虚拟方法。 我和一位同行讨论了C语言中的<code>virtual</code>关键字。在一个较旧的ubuntu操作系统上,我正在编写一个程序,该程序报告了调用“纯虚拟方法”的错误,这是不应该发生的 单步执行调试器后,我终于在继承的类上添加了 在告诉我的同龄人之前,我仔细检查了谷歌是否有任何可能表