我正在尝试创建一组具有不同抽象级别的类。我将在这里使用Vector示例。
我的目标是我的类的用户可以选择要使用的抽象级别,即他们可能想要也可能不想使用更派生的类。
interface IVector
{
Vector A();
}
interface ISparseVector : IVector
{
new SparseVector A();
}
现在,我实现这样的类:
class Vector : IVector
{
public Vector A() { return new Vector(); }
}
class SparseVector : Vector,ISparseVector
{
public new SparseVector A() { return new SparseVector(); }
}
这一切都很好,花花公子。但是,当基类是抽象的时,例如:
abstract class Vector : IVector
{
public abstract Vector A();
}
class SparseVector : Vector,ISparseVector
{
public SparseVector A() { return new SparseVector(); } // Hides abstract member.
}
我收到编译错误,说导出的方法隐藏了Vector中的抽象方法。知道怎么解决这个问题吗?
答案 0 :(得分:6)
您想要的功能称为“返回类型协方差”,它不是C#的功能。返回类型协方差是一种功能,您可以使用返回Animal的虚方法,然后使用返回长颈鹿的方法覆盖它。
这样做是类型安全的,有些语言确实有这个功能 - 例如C ++ - 但C#没有,我们没有计划添加它。您的重写方法必须标记为覆盖,并且必须完全匹配 - 名称,形式参数类型和返回类型。
答案 1 :(得分:1)
原因在于您在Vector类的第一个示例中,您没有为A()方法指定访问级别。这意味着它是一个私有方法,这是默认方法。您可以在SparseVector类中使用new关键字来解决此错误。
答案 2 :(得分:0)
首先,您应该查看此线程,该线程指定您不能拥有抽象构造函数的原因。
Why can't I create an abstract constructor on an abstract C# class?
然后,您应该在Vector类中放置一个抽象方法,该方法实际上可以被覆盖以提供实现,因为抽象方法应该是。
答案 3 :(得分:0)
您不能以您尝试的方式混合抽象和接口方法。如果您要声明'Vector'抽象并覆盖A()的实现,那么您将从抽象类中重写'Vector A()',但这不会实现接口ISparseVector.Vector,它具有返回值ISparseVector的类型。
您的用例似乎并不要求'Vector'是抽象的。