3

モジュールの抽象基本レイヤーを提供する際に少し問題があり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[]
  • 配列をリスト クラスでラップする

そして、もう少し考えてみれば、おそらくあと数回。ただし、どれも非常にエレガントに見えません。

ここで大きな疑問が生じます:

  • 私は単純なものを見落としていますか?
  • 実装の配列がインターフェイスの配列と共変になることはありますか?

また、コンパイラの苦情の理由を本当に想像することはできません。私のコードには、問題なくコンパイルされたより複雑な構造があります。したがって、これがそのまま機能しない理由を誰かが説明できれば、それは大歓迎です。

4

1 に答える 1