C# 错误CS0534-未实现继承的抽象成员
我有以下4门课: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()
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。