Аноним
Зарегистрирован: 18 February 2005
Сообщения: 13860
Примеры кода: 0
|
Re[4]: Как бороть отсутствие variance для генериков? |
02 February 2007 18:38 |
|
|
|
|
Здравствуйте, _FRED_, Вы писали:
_FR>Но я так и не понял, чем не устраивает первый вариант
_FR>
_FR>public IThese<T> AsBase { get { return this; }}
_FR>
_FR> :???:
_FR>И как и для чего собирается использоваться IThese<IThis>? Имхо, действительно, надо написать интерфейс IThisThese… (нахвание сам уж придумай ) и наследовать его в IThese<T>, например.
Проблема решена, но не элегантно :-\
А смысл был в следующем:
interface IThis {}
interface IThis2 : IThis {}
interface IThis3 : IThis2 {}
// и т.п.
// IThese<> - интерфейс контейнера, содержащего объекты, реализующие IThis и его наследников
interface IThese<T> where T : IThis
{
// ...
// создает строго типизированное представление на основе собственных данных
ITheseView<T> CreateView();
// создает не столь строго типизированное представление на основе указанных источников данных
ITheseView<IThis> CreateView(ICriteria<T> criteria, params IThese<IThis> sources);
// ...
}
interface ITheseView<T> : IThese<T> where T : IThis
{
// ...
ICriteria<T> Criteria { get; }
// ...
}
Вот и хотелось бы, чтобы класс, реализующий IThese<T>, легко и непринужденно реализовывал IThese<IThis>. Но из-за отсутствия ковариантности генериков, приходится городить дополнительные строчки просто для приведения типа T, возвращаемого методами и свойствами этого класса к IThis (а есть еще такие вещи, как IEnumerable<T>, IComparable<T> where T : IThis и т.п., реализуемые или возвращаемые этим же классом), либо вводить негенерик интерфейсы IThese и ITheseView (как я уже писал, как это делает тот же List<T>), и снова их отдельно реализовывать. Ото таке.
Спасибо за участие в обсуждении, вопрос я для себя закрыл.
Данное сообщение получено с сайта RSDN
|
|