返回比接口指定的更多派生类

Joh*_*dén 2 c#

我正在尝试创建一组具有不同抽象级别的类.我将在这里使用Vector示例.

我的目标是我的类的用户可以选择要使用的抽象级别,即他们可能或可能不想使用更多派生类.

interface IVector
{
    Vector A();
}

interface ISparseVector : IVector
{
    new SparseVector A();
}
Run Code Online (Sandbox Code Playgroud)

现在,我实现这样的类:

class Vector : IVector
{
    public Vector A() { return new Vector(); }
}

class SparseVector : Vector,ISparseVector
{
    public new SparseVector A() { return new SparseVector(); }
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,花花公子.但是,当基类是抽象的时,例如:

abstract class Vector : IVector
{
    public abstract Vector A();
}

class SparseVector : Vector,ISparseVector
{
    public SparseVector A() { return new SparseVector(); } // Hides abstract member.
}
Run Code Online (Sandbox Code Playgroud)

我得到一个编译错误,说派生的方法隐藏了Vector中的抽象方法.知道怎么解决这个问题吗?

Eri*_*ert 6

您想要的功能称为"返回类型协方差",它不是C#的功能.返回类型协方差是一种功能,您可以使用返回Animal的虚方法,然后使用返回Giraffe的方法覆盖它.

这样做是类型安全的,有些语言确实有这个功能 - 例如C++ - 但C#没有,我们没有计划添加它.您的重写方法必须标记为覆盖,并且必须完全匹配 - 名称,形式参数类型和返回类型.