您需要使用override
关键字。否则,您不会实现抽象基类,而只是在子类上创建一个“新”的单独方法。
public override bool Save(SpaghettiTable obj)
{
return false;
}
把abstract
方法想象成virtual
你重写的方法。唯一的区别是您强制子类提供该方法的实现,而virtual
方法提供自己的实现,子类可以选择用自己的实现覆盖。
编辑:此外,如果您想让 Visual Studio 中的生活更轻松,您可以右键单击(或ctrl+.
)继承声明并选择“实现抽象类”(或类似的东西,我没有 VS 对now) 它将自动为您创建所有覆盖的方法。
public class SpaghettiTableDb : DbHandler<SpaghettiTable> //right-click on "DbHandler"
或者,在类中的空白代码空间中,您可以开始键入“覆盖”,然后 IntelliSense 将列出基类中的所有可覆盖成员,当您选择一个时,它会自动为您编写一个默认实现。
编辑:只是为了扩展您在代码中的内容,没有override
关键字,您正在创建一个属于您的子类而不是覆盖基类的新方法。当您调用该方法但从使用基类的上下文中时,它不会调用您的子类实现,因为它不会覆盖基方法。
考虑以下类。(我使用 virtual 而不是 abstract 只是为了编译并使其更简单)
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
,另一个键入为BaseClass
。当运行时调用时myBase.Print()
,它可以很容易地检查类的继承,并查看SubClass
是否覆盖了Print
方法并调用了SubClass
实现。但是,由于SubClass.AnotherPrint
没有明确标记为override
,运行时/编译器认为这是一个完全不同的方法,没有到该BaseClass.AnotherPrint
方法的链接。因此,运行时坚持基类实现。当您的实例被键入为SubClass
虽然时,编译器确实会看到您指向该新方法,而不是基本实现。