2009-07-06 15 views
1

私はIRepository<TObject>から継承したIRepositoryインターフェイスを持っています。私はまたIRepository<TObject>を実装するS QLRepository<TObject>から継承するSqlRepositoryクラスを持っています。 IRepositoryとしてSqlRepositoryのインスタンスをインスタンス化できないのはなぜですか?汎用クラスを汎用インターフェイスに変換できません。なぜですか?

public class MyObject : IObject { 
    ... 
} 

public interface IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public interface IRepository : IRepository<MyObject> { } 

public class SqlRepository<TObject> : IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public class SqlRepository : SqlRepository<MyObject> { } 

public class Controller { 
    private IRepository _repository; 

    public Controller() { 
     _repository = new SqlRepository(); 
    } 
} 

次のエラーメッセージで、コントローラクラスに_repositoryする新しいSqlRepositoryを割り当てるしようとすると、上記の例は失敗します。

Argument '1': cannot convert from 'SqlRepository' to 'IRepository' 

私が把握できなかった継承の基本原則は、どのようなものですか。

+0

SqlRespositoryにIRepository(パブリッククラスSqlRepository:SqlRepository:、IRepository {})を実装することで問題を解決しましたが、これは余計なようですが、ロジックを理解していると思います。 – kim3er

答えて

10

IRepositoryIRepository<MyObject>なので、それ以外の方法ではありません。

は基本的に:

SqlRepositoryIRepository<MyObject>あるSqlRepository<MyObject>
です。
IRepository<TObject>IRepositoryから継承するか、またはSqlRepositoryIRepositoryに設定してください。

この問題は、ジェネリック固有の問題ではありません。想定:

interface IMovable { } 
interface IDrivable : IMovable { } 
class Ball : IMovable { } 

それはそれはIMovableている間BallIDrivableではないことは明らかです。

1

SqlRepositoryは、であり、IRepositoryではありません。

0

は、私はあなたがこのようにそれを宣言する必要があると思う:

private IRepository<MyObject> _repository; 
0

SqlRepositoryが直接IRepositoryから継承していない、それはIRepository<MyObject>から継承しています。

SqlRepositoryIRepositoryから直接継承してください。

0

ジェネリック型もサブクラス化できます。

パブリッククラスSqlObjectRepository:SqlRepository {...}

しかし、私はあなたがその場でそれを行うことができるとは思いません。それはオブジェクトの定義の一部である必要があります。

関連する問題