无法将通用类转换为通用接口,为什么?

时间:2009-07-06 19:38:50

标签: c# inheritance repository

我有一个继承自IRepository<TObject>的IRepository接口。我还有一个继承自S QLRepository<TObject>的SqlRepository类,后者又实现IRepository<TObject>。为什么我不能将SqlRepository的实例实例化为IRepository?

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();
    }
}

上面的示例在尝试将新的SqlRepository分配给Controller类中的_repository时失败,并显示以下错误消息。

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

我没有掌握哪种基本的继承原则,请帮助。

5 个答案:

答案 0 :(得分:10)

因为IRepositoryIRepository<MyObject>,而不是相反。

基本上:

SqlRepositorySqlRepository<MyObject>
这是一个IRepository<MyObject> 要做到这一点,您应该从IRepository<TObject>继承IRepository或根据您的意图使SqlRepository实施IRepository

这个问题根本不是特定于泛型的。假设:

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

很明显,Ball不是IDrivable,而是IMovable

答案 1 :(得分:1)

SqlRepository实施IRepository<T>,而不是IRepository

答案 2 :(得分:0)

我认为你需要这样声明:

private IRepository<MyObject> _repository;

答案 3 :(得分:0)

SqlRepository不直接从IRepository继承,它继承自IRepository<MyObject>

尝试直接从SqlRepository继承IRepository

答案 4 :(得分:0)

您也可以继承泛型类型。

public class SqlObjectRepository:SqlRepository {...}

但我不认为你能做到这一点。它需要成为对象定义的一部分。