C#泛型和继承

标签 c# generics inheritance

我在以下代码中遇到编译错误:

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 只是一个具有一些属性的类,仅此而已)

有什么帮助吗?

最佳答案

您需要使用 override关键词。否则,您不会实现抽象基类,而只是在子类上创建一个“新的”单独方法。

public override bool Save(SpaghettiTable obj)
{
    return false;
}

想到abstract方法就像 virtual您重写的方法。唯一的区别是您强制子类提供该方法的实现,而virtual方法提供了它们自己的实现,子类可以可选地用它们自己的实现覆盖。

编辑:此外,如果你想让你在 Visual Studio 中的生活更轻松,你可以右键单击(或 ctrl+.)继承声明并选择“实现抽象类”(或类似的东西,我不我现在没有 VS),它会自动为你创建所有重写的方法。

public class SpaghettiTableDb : DbHandler<SpaghettiTable> //right-click on "DbHandler"

或者,在类的空白代码空间中,您可以开始键入“覆盖”,然后 IntelliSense 将列出基类中所有可覆盖的成员,当您选择一个时,它会自动为您编写默认实现。

编辑: 只是为了扩展代码中的内容,没有 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

注意通过代码,mySubmyBase两者都指向相同的对象,但其中一个的类型为 SubClass另一个为BaseClass .当运行时调用 myBase.Print() , 它可以很容易地检查类的继承并看到 SubClass已覆盖 Print方法并调用 SubClass执行。然而,由于 SubClass.AnotherPrint未明确标记为 override ,运行时/编译器认为这是一个完全不同的方法,没有指向 BaseClass.AnotherPrint 的链接方法。因此,运行时坚持基类实现。当您的实例输入为 SubClass不过,编译器确实看到您指向的是新方法,而不是基本实现。

关于C#泛型和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122941/

相关文章:

c# - 返回 null 以避免 C# 中的方法出现未知异常

c# - 在 Silverlight 中,如何从模板中获取动画并通过 C# 代码使用它?

java - List<E>.contains(Object),为什么?

c# - 是否可以将多个通用类型参数传递给一个方法?

java - 将 Java 泛型参数类型限制为最终类的列表

C++使用基类指针访问派生类方法

c# - XmlSerializer 忽略公共(public)字段?

c# - 更改 Gtk.Label.Text 并不总是有效

javascript - JavaScript 中的原型(prototype)继承是如何工作的?

c++ - 为什么 'virtual' 继承不是默认行为?