我有一个继承自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'
我没有掌握哪种基本的继承原则,请帮助。
答案 0 :(得分:10)
因为IRepository
是IRepository<MyObject>
,而不是相反。
基本上:
SqlRepository
是SqlRepository<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 {...}
但我不认为你能做到这一点。它需要成为对象定义的一部分。