Скажем, у меня есть эти два класса«ковариации» в параметрах шаблона
class BaseClass
{
protected HashSet<BaseClass> container;
}
class DerivedClass : BaseClass
{
DerivedClass()
{
container = new HashSet<DerivedClass>();
}
}
Тогда я получаю сообщение об ошибке: Не удается преобразовать.
Поскольку каждый DerivedClass (должен) быть BaseClass, я не совсем уверен, почему эта ошибка возникает, но это так.
Цель состоит в том, чтобы BaseClass выполнял множество операций на container
, причем только особые особенности, связанные с DerivedClass, - среди тех, которые требуют, чтобы контейнер имел тип HashSet<DerivedClass>
.
Как эта цель обычно достигается?
Ковариация допускается только в интерфейсах. http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx Я бы рекомендовал прочитать всю серию. – lukegravitt
Это не похоже на великолепную архитектуру.Почему базовый класс будет работать со своими производными типами? Почему набор не может быть 'new HashSet()'? –
Ваш дизайн не безопасен по типу. Если метод в «BaseClass» пытается добавить произвольный экземпляр «BaseClass» в 'container', у вас возникнет конфликт типа. – recursive