私は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'
私が把握できなかった継承の基本原則は、どのようなものですか。
SqlRespositoryにIRepository(パブリッククラスSqlRepository:SqlRepository:、IRepository {})を実装することで問題を解決しましたが、これは余計なようですが、ロジックを理解していると思います。 –
kim3er