问题描述
我有一个从IRepository<TObject>
继承的IRepository接口.我也有一个从S QLRepository<TObject>
继承的SqlRepository类,该类又实现了IRepository<TObject>
.为什么不能将SqlRepository的实例实例化为IRepository?
I have an IRepository interface that inherits from IRepository<TObject>
. I also have a SqlRepository class that inherits from SQLRepository<TObject>
, which in turn implements IRepository<TObject>
. Why can't I instantiate a instance of SqlRepository as an 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时失败,并显示以下错误消息.
The example above fails when trying to assign a new SqlRepository to _repository in the Controller class, with the following error message.
Argument '1': cannot convert from 'SqlRepository' to 'IRepository'
我没有掌握继承的基本原理,请帮忙.
Which basic principle of inheritance have I failed to grasp, please help.
推荐答案
因为IRepository
是IRepository<MyObject>
,而不是相反.
基本上:
SqlRepository
是SqlRepository<MyObject>
这是IRepository<MyObject>
.
为此,您应该根据自己的意愿从IRepository
继承IRepository<TObject>
或使SqlRepository
实现IRepository
.
SqlRepository
is a SqlRepository<MyObject>
which is an IRepository<MyObject>
.
To make that work, you should either inherit IRepository<TObject>
from IRepository
or make SqlRepository
implement IRepository
depending in your intention.
此问题根本不是泛型特有的.假设:
This issue is not generics-specific at all. Assume:
interface IMovable { }
interface IDrivable : IMovable { }
class Ball : IMovable { }
很明显,Ball
不是IDrivable
而是IMovable
.
这篇关于无法将通用类转换为通用接口,为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!