Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误CS0534-未实现继承的抽象成员_C#_Abstract Class - Fatal编程技术网

C# 错误CS0534-未实现继承的抽象成员

C# 错误CS0534-未实现继承的抽象成员,c#,abstract-class,C#,Abstract Class,我有以下4门课: public abstract class Base { abstract public void DoIt(); } public class TW: Base {} public class RW: TW { public override void DoIt() {} } public class IW: TW { public override void DoIt() {} } 用法: var transaction = new TW()

我有以下4门课:

public abstract class Base
{
     abstract public void DoIt();
}

public class TW: Base {}
public class RW: TW 
{
    public override void DoIt() {}
}
public class IW: TW
{
    public override void DoIt() {}
}
用法:

var transaction = new TW();
transaction.DoIt();
我不清楚为什么会出现以下错误:

错误CS0534“TW”未实现继承的抽象成员 'Base.DoIt()'

如果所有的“叶子”派生类(RW和IW)都覆盖了它,为什么(TW)也需要覆盖它呢?我可能错过了一些东西,因为我记得这不是必须的。我不想在TW中重写它,因为我没有任何有效的实现可以在那里编写

我希望自己能够写出这样的东西:

public override abstract void DoIt();
什么是正确的实现

更新:

根据我得到的答案,由于某些限制,我必须按照以下方式实施:

public override void DoIt()
{
    //Not getting to this code, it is overriden by the derived classes
}
可以接受吗?
我觉得如果我陷入这样的情况,架构中可能有问题。

您也必须将TW作为一个抽象类

public abstract class Base
{
     public abstract void DoIt();
}

public abstract class TW: Base {}

public class RW: TW 
{
    public override void DoIt() {}
}

public class IW: TW
{
    public override void DoIt() {}
}

您还必须使TW成为一个抽象类

public abstract class Base
{
     public abstract void DoIt();
}

public abstract class TW: Base {}

public class RW: TW 
{
    public override void DoIt() {}
}

public class IW: TW
{
    public override void DoIt() {}
}

因为你编辑了你的问题:这里有一个新的答案

var transaction = new TW();
transaction.DoIt();  // compiler error because this method does not really exist.

在您的代码示例中,TW继承自Base。在Base中,您将DoIt()声明为抽象方法。这意味着它没有实现,它只是一个接口。您必须在继承的类中实现该方法,否则编译器会抱怨。

因为您编辑了您的问题:这里有一个新答案

var transaction = new TW();
transaction.DoIt();  // compiler error because this method does not really exist.

在您的代码示例中,TW继承自Base。在Base中,您将DoIt()声明为抽象方法。这意味着它没有实现,它只是一个接口。您必须在继承的类中实现该方法,否则编译器会抱怨。

如果您不希望
TW
是一个抽象类,但不希望提供
DoIt
的“真实”实现,那么您应该在
DoIt
中抛出异常,而不是返回

public override void DoIt()
{
    throw new NotSupportedException(
        "The DoIt() method was called on a class which does not support that method.");
}

如果您不希望
TW
成为一个抽象类,但不希望提供
DoIt
的“真实”实现,那么您应该在
DoIt
中抛出异常,而不是返回异常

public override void DoIt()
{
    throw new NotSupportedException(
        "The DoIt() method was called on a class which does not support that method.");
}

您希望
new TW().DoIt()
做什么?具体的子类必须确保没有剩余的抽象成员,这是绝对必要的。也许你也希望
TW
是抽象的?(你的代码没有指定任何访问修饰符也没有帮助。请修复帖子,这样唯一的错误就是你感兴趣的错误。)实际上什么都没有。只有派生类才能在那里完成jobs@ascholz:如果直接实例化它,则必须实现所有抽象继承成员。如果需要添加无操作实现,请这样做。你关于“叶子”类的问题表明你不太清楚抽象的目的。。。它的意思是告诉编译器“可以调用此方法-我知道它将在我调用它的任何对象中实现。”这里的
TW
不是这种情况。不,尝试从void方法返回值是不可接受的,在
override
void
之间缺少空格也是不可接受的。。。我知道你可能觉得它不重要,因为它“只是”一个堆栈溢出帖子,但堆栈溢出的目的是提供一个高质量问题和答案的存储库。。。发布伪代码有损于这一目标。至于你的最后一个问题,关于它是否“可接受”——嗯,它是有效的。但奇怪的是,您有一个从
Base
(在本例中为
TW
)派生的类,您希望实例化它,但实际上并不想实现
DoIt
。不幸的是,从非常有限的上下文来看,我们不知道这是“有点奇怪”还是一个糟糕设计的症状。您希望
new TW().DoIt()
做什么?具体的子类必须确保没有剩余的抽象成员,这是绝对必要的。也许你也希望
TW
是抽象的?(你的代码没有指定任何访问修饰符也没有帮助。请修复帖子,这样唯一的错误就是你感兴趣的错误。)实际上什么都没有。只有派生类才能在那里完成jobs@ascholz:如果直接实例化它,则必须实现所有抽象继承成员。如果需要添加无操作实现,请这样做。你关于“叶子”类的问题表明你不太清楚抽象的目的。。。它的意思是告诉编译器“可以调用此方法-我知道它将在我调用它的任何对象中实现。”这里的
TW
不是这种情况。不,尝试从void方法返回值是不可接受的,在
override
void
之间缺少空格也是不可接受的。。。我知道你可能觉得它不重要,因为它“只是”一个堆栈溢出帖子,但堆栈溢出的目的是提供一个高质量问题和答案的存储库。。。发布伪代码有损于这一目标。至于你的最后一个问题,关于它是否“可接受”——嗯,它是有效的。但奇怪的是,您有一个从
Base
(在本例中为
TW
)派生的类,您希望实例化它,但实际上并不想实现
DoIt
。不幸的是,从非常有限的上下文中,我们不知道这是“有点奇怪”还是一个糟糕设计的症状。我无法使它抽象,因为我正在实例化它。因此,在TW上实现DoIt(),那么您就别无选择:实现DoIt。我无法使它抽象,因为我正在实例化它。因此,实现DoIt()在twt上,您别无选择:实现DoIt。