我在以下代码中遇到编译错误:
public abstract class DbHandler<T>
{
public abstract bool Save(T obj);
...
}
及其实施类:
public class SpaghettiTableDb : DbHandler<SpaghettiTable>
{
public bool Save(SpaghettiTable obj)
{
return false;
}
...
}
错误是:
'SpaghettiTableDb' does not implement inherited abstract member 'SeatPicker.DbHandler<SeatPicker.SpaghettiTable>.Save(SeatPicker.SpaghettiTable)'
但我认为确实如此,所以我不确定为什么我会收到这个错误。
(SpaghettiTable只是一个具有某些属性的类,仅此而已)
任何帮助?
答案 0 :(得分:5)
您需要使用override
关键字。否则,您没有实现抽象基类,只是在子类上创建一个“新的”单独方法。
public override bool Save(SpaghettiTable obj)
{
return false;
}
考虑abstract
方法,就像您覆盖的virtual
方法一样。唯一的区别是你强制子类提供该方法的实现,而virtual
方法提供了自己的实现,子类可以可选地覆盖它们自己的实现。
编辑:此外,如果你想在Visual Studio中让生活更轻松,你可以右键单击(或ctrl+.
)继承声明并选择“实现抽象类”(或类似的东西,我现在没有和我在一起)这将自动为你创建所有被覆盖的方法。
public class SpaghettiTableDb : DbHandler<SpaghettiTable> //right-click on "DbHandler"
或者,在类中的空代码空间中,您可以开始键入“override”,然后IntelliSense将列出基类中的所有可覆盖成员,当您选择一个时,它将自动为您编写默认实现。< / p>
编辑:
只是为了扩展您的代码中没有override
关键字的内容,您将创建一个属于您的子类而不是覆盖基类的新方法。当您从使用基类的上下文调用该方法时,它不会调用您的子类实现,因为它不会覆盖基本方法。
考虑以下课程。 (我使用虚拟而不是抽象,因此它编译并使其更简单)
public class BaseClass
{
public virtual void Print()
{
Console.WriteLine("base print");
}
public virtual void AnotherPrint()
{
Console.WriteLine("base another print");
}
}
public class SubClass : BaseClass
{
public override void Print()
{
Console.WriteLine("sub print");
}
public void AnotherPrint()
{
Console.WriteLine("sub another print");
}
}
请注意SubClass.AnotherPrint
不覆盖BaseClass.AnotherPrint
。
当您使用以下代码时:
SubClass mySub = new SubClass();
mySub.Print(); //sub print
mySub.AnotherPrint(); //sub another print
BaseClass myBase = mySub;
myBase.Print(); //sub print
myBase.AnotherPrint(); //base another print
请注意,通过代码,mySub
和myBase
都指向同一个对象,但其中一个输入为SubClass
,另一个输入为{{ 1}}。当运行时调用BaseClass
时,它可以轻松检查类的继承,并看到myBase.Print()
已覆盖SubClass
方法并调用Print
实现。但是,由于SubClass
未明确标记为SubClass.AnotherPrint
,因此运行时/编译器认为它是完全不同的方法,没有指向override
方法的链接。因此,运行时坚持基类实现。当你的实例被输入为BaseClass.AnotherPrint
时,编译器确实会看到你指向那个新方法,而不是基本实现。
答案 1 :(得分:2)
在实现抽象方法或覆盖虚方法时,需要使用override
关键字。
public override bool Save(SpaghettiTable obj)
{
return false;
}