我在为我的dataaccess.mysqlclient
模块提供抽象基础层时遇到了一点问题,我在其中定义了一堆满足最低要求的接口和一堆实现它们的类。
现在 dmd 编译器抱怨:
Error: function dataaccess.mysqlclient.MySqlReader.columns of type @property MySqlColumnInfo[]() overrides but is not covariant with dataaccess.dbclient.IDbReader.columns of type @property IDbColumnInfo[]()
Exit code 1
相关的代码行如下所示:
IDbReader:
interface IDbReader
{
@property IDbColumnInfo[] columns();
// ...
}
MySqlReader:
class MySqlReader : IDbReader
{
private MySqlColumnInfo[] _columns;
@property public MySqlColumnInfo[] columns() {return _columns;}
// ...
}
有几种方法可以解决这个编译器问题;
- 声明具体属性为
IDbColumnInfo[]
- 将数组包装在列表类中
如果我再想一想,可能还有更多。不过,这些看起来都不是很优雅。
大问题来了:
- 我忽略了一些简单的事情吗?
- 实现数组可以与接口数组协变吗?
我也无法想象编译器抱怨的原因。我的代码中有更复杂的结构,它们已经编译得很好。因此,如果有人可以解释为什么这不能按原样工作,那将不胜感激。