2013-12-03 6 views
1

я кодирования репозиторий и я был со следующей проблемой:Какая разница между этими двумя типами наследования?

Приведенный ниже код показывает ошибку, как если хранилище были наследуя IRepository тип интерфейса и T был унаследовать IDisposable

public class GenericRepository<T> : IGenericRepository<T> where T : class, IDisposable 

Итак, когда я изменил порядок наследования, проблема была решена

public class GenericRepository<T> : IDisposable, IGenericRepository<T> where T : class 

Мое решение этой проблемы:

+2

в первой версии, каждый 'T' должен быть классом и реализовать IDisposable. Во второй версии класс 'GenericRepository ' должен реализовать IDisposable. Это не то же самое (и первая версия не имеет большого смысла в логике шаблонов репозитория) –

ответ

2

Первое:

public class GenericRepository<T> : IGenericRepository<T> where T : class, IDisposable 

усиливает IDisposable ограничение на тип T, тогда как:

public class GenericRepository<T> : IDisposable, IGenericRepository<T> where T : class 

требует GenericRepository<T> для реализации IDisposable.

Вам решать, как вы хотите проектировать свои репозитории - я бы выбрал последний. Я бы сказал, что его репозиторий несет ответственность за распоряжение своими ресурсами.

3

В вашем первом фрагменте кода IDisposable является частью ограничения.

В вашем втором фрагменте кода IDisposable - это интерфейс, который реализует ваш GenericRepository<T>.

1

Ну, ваша первая строка явно говорит, что T должен быть IDisposable.

Вторая строка говорит, что ваш GenericRepository должен быть IDisposable. Если это ваше намерение - да, ваше решение верно.

3
public class GenericRepository<T> : IGenericRepository<T> where T : class, IDisposable 

ограничивает типа параметра T для реализации IDisposable.

С вторым кодом вы показываете, это GenericRepository<T>, которая необходима для реализации IDisposable интерфейса, независимо от того, что Т.

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