モジュールの抽象基本レイヤーを提供する際に少し問題があり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[]
- 配列をリスト クラスでラップする
そして、もう少し考えてみれば、おそらくあと数回。ただし、どれも非常にエレガントに見えません。
ここで大きな疑問が生じます:
- 私は単純なものを見落としていますか?
- 実装の配列がインターフェイスの配列と共変になることはありますか?
また、コンパイラの苦情の理由を本当に想像することはできません。私のコードには、問題なくコンパイルされたより複雑な構造があります。したがって、これがそのまま機能しない理由を誰かが説明できれば、それは大歓迎です。