Преобразование типа класса шаблона?
-
21-08-2019 - |
Вопрос
У меня есть класс с именем «baseClass».От этого класса я наследую имена классов «inheritedClass» (публичный класс inheritedClass:базовый класс)
Базовый класс содержит общедоступную функцию, которая возвращает HashSet<baseClass>
.При вызове из inheritedClass тип возвращаемого значения, очевидно, остается неизменным. HashSet<baseClass>
, но мне нужен HashSet<inheritedClass>
.
Конверсия аля(HashSet<inheritedClass>
)returnValue, где returnValue имеет тип HashSet<baseClass>
не работает.
Есть ли способ преобразовать HashSet-Type из baseClass в inheritedClass без преобразования каждого элемента вручную?
Заранее спасибо, Фрэнк
Решение
Вы действительно имеете в виду C# в тегах? HashMap
это тип Java.Кроме того, он обычно имеет два параметра типа, а не один...
В C# универсальные классы всегда инвариантны. Некоторый интерфейсы воля быть вариантами в C# 4, но очень немногими (только те, которые либо только используйте параметр типа в выходной позиции, например. IEnumerable<T>
, или только используйте параметр типа во входной позиции, например. IComparable<T>
).
Если вы предоставите более точную информацию о вашей ситуации, мы, вероятно, сможем помочь найти простое решение, особенно если вы сможете использовать LINQ с его Cast<T>()
метод.
РЕДАКТИРОВАТЬ:Хорошо, с HashSet<T>
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Обратите внимание, что даже в C# 4 это было бы необходимо, поскольку компилятор не знает, что каждое значение в baseSet
является примером DerivedType
- должна быть проверка времени выполнения.Обратное (создание HashSet<BaseType>
из HashSet<DerivedType>
) бы работаю на С#4.
ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:Если вы просто хотите использовать UnionWith
, для этого не требуется HashSet<DerivedType>
- это требует IEnumerable<DerivedType>
.Я предлагаю вам сделать:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Другие советы
Вот решение
//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
public HashSet<T> GetHashSet()
{
HashSet<T> _hSet = new HashSet<T>();
//do some work
//create a HashSet<T> and return;
return _hSet;
}
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
//you have the method inherited as you need.}
}