Conversione del tipo di una classe template?
-
21-08-2019 - |
Domanda
Ho una classe denominata "BaseClass". Da questa classe ho ereditare una nomi di classe "inheritedClass" (inheritedClass public class: BaseClass)
Il BaseClass contiene una funzione pubblica che restituisce un HashSet<baseClass>
. Quando viene chiamato dal inheritedClass, il tipo di ritorno è ovviamente ancora HashSet<inheritedClass>
, ma ho bisogno di un <=>.
Un ala di conversione (<=>) returnValue, dove returnValue è di tipo <=> non funziona.
C'è un modo per convertire il HashSet-Type da BaseClass a inheritedClass senza convertire manualmente ogni elemento?
Grazie in anticipo, Frank
Soluzione
Vuoi davvero dire C # nei tag? HashMap
è un tipo Java. Inoltre ha generalmente due parametri di tipo piuttosto che uno ...
In C #, classi generiche sono sempre invarianti. Alcuni interfacce essere variante in C # 4, ma pochissimi (solo quelle che o solo utilizza il parametro di tipo in un positiion uscita, ad esempio < => o solo utilizzare il parametro di tipo in una posizione di ingresso, ad esempio IEnumerable<T>
).
Se è possibile fornire informazioni più precise sulla tua situazione, saremo probabilmente in grado di contribuire a trovare una soluzione semplice -. Specialmente se si può usare LINQ con il suo metodo IComparable<T>
EDIT: Okay, con Cast<T>()
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Si noti che anche con C # 4 ciò sarebbe necessario perché il compilatore non sa che ogni valore in HashSet<T>
è un esempio di baseSet
- ci deve essere un controllo di esecuzione in tempo. Il contrario (la creazione di un DerivedType
da un HashSet<BaseType>
) farebbe lavoro in C # 4.
ULTERIORI EDIT: Se si desidera utilizzare HashSet<DerivedType>
, che non necessita di un UnionWith
- richiede una IEnumerable<DerivedType>
. Vi suggerisco di fare:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Altri suggerimenti
Ecco la soluzione
//**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.}
}