2009-07-06 4 views
1

У меня есть интерфейс IRepository, который наследуется от IRepository<TObject>. У меня также есть класс SqlRepository, который наследуется от S QLRepository<TObject>, который, в свою очередь, реализует 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 к _repository в классе контроллера со следующим сообщением об ошибке.

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

Какой основной принцип наследования я не смог понять, пожалуйста, помогите.

+0

Я решил проблему, сделав SqlRespository реализовать IRepository (открытый класс SqlRepository: SqlRepository , IRepository {}), который кажется немного лишним, но, я думаю, я понимаю логику. – kim3er

ответ

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

SqlRepository инвентарь IRepository<T>, а не IRepository.

0

Я думаю, что вам нужно объявить его как это:

private IRepository<MyObject> _repository; 
0

SqlRepository непосредственно не наследуют от IRepository, он наследует от IRepository<MyObject>.

Попытка иметь SqlRepository унаследовать непосредственно от IRepository.

0

Вы также можете подклассифицировать общие типы.

SqlObjectRepository общественный класс: SqlRepository {...}

Но я не думаю, что вы можете сделать это на лету. Он должен быть частью определения объекта.

 Смежные вопросы

  • Нет связанных вопросов^_^