La conversión del tipo de una clase de plantilla?
-
21-08-2019 - |
Pregunta
Tengo una clase llamada "BaseClass". A partir de esta clase que heredan una nombres de clase "inheritedClass" (inheritedClass clase pública: BaseClass)
La clase base contiene una función pública que devuelve un HashSet<baseClass>
. Cuando se llama desde el inheritedClass, el tipo de retorno es, evidentemente, todavía HashSet<inheritedClass>
, pero necesito un <=>.
Un ala de conversión (<=>) returnValue, donde returnValue es de tipo <=> no funciona.
¿Hay una manera de convertir el HashSet-Tipo de BaseClass a inheritedClass sin convertir cada elemento manualmente?
Gracias de antemano, Frank
Solución
¿Realmente decir C # en las etiquetas? HashMap
es un tipo Java. También tiene dos parámetros de tipo general en lugar de uno ...
En C #, clases genéricas son siempre invariables. Algunos interfaces de ser variante en C # 4, pero muy pocos (sólo aquellos que o bien solamente utiliza el parámetro de tipo en un positiion salida, por ejemplo < => o solamente utilizar el parámetro de tipo en una posición de entrada, por ejemplo, IEnumerable<T>
).
Si usted puede proporcionar una información más precisa acerca de su situación, probablemente vamos a ser capaces de ayudar a llegar a una solución simple -. Especialmente si se puede usar LINQ con su método IComparable<T>
EDIT: Bueno, con Cast<T>()
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Tenga en cuenta que incluso con C # 4 sería necesario porque el compilador no sabe que todos los valores de HashSet<T>
es una instancia de baseSet
- tiene que haber un control en tiempo de ejecución. La inversa (la creación de un DerivedType
de un HashSet<BaseType>
) haría trabajo en C # 4.
hacer otras modificaciones: Si lo que desea es utilizar HashSet<DerivedType>
, que no requiere una UnionWith
- se requiere un IEnumerable<DerivedType>
. Le sugiero que haga:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Otros consejos
Aquí está la solución
//**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.}
}