Die Umwandlung der Art einer Template-Klasse?
-
21-08-2019 - |
Frage
Ich habe eine Klasse mit dem Namen „Baseclass“. Von dieser Klasse erben ich ein Klassennamen "inheritedClass" (public class inheritedClass: Baseclass)
Die Basisklasse enthält eine öffentliche Funktion, die eine HashSet<baseClass>
zurückgibt. Beim Übergang vom inheritedClass genannt, ist der Rückgabetyp offensichtlich noch HashSet<baseClass>
, aber ich brauche eine HashSet<inheritedClass>
.
Eine Umwandlung ala (HashSet<inheritedClass>
) return, wo return von Typ HashSet<baseClass>
ist nicht funktioniert.
Gibt es eine Möglichkeit, das HashSet-Type von Baseclass zu inheritedClass zu konvertieren, ohne jedes Element manuell zu konvertieren?
Vielen Dank im Voraus, Frank
Lösung
Wollen Sie wirklich C # in den Tags? HashMap
ist ein Java-Typ. Auch im Allgemeinen hat es zwei Typparameter eher als ein ...
In C # sind generische Klassen immer unveränderlich. Einige Schnittstellen wird sein Variante in C # 4, aber nur sehr wenige (nur solche, die entweder nur den Typ-Parameter in einem Ausgang positiion verwenden, zB IEnumerable<T>
oder nur die Typ-Parameter in einer Eingabeposition verwendet werden, zB IComparable<T>
).
Wenn Sie genauere Informationen über Ihre Situation zur Verfügung stellen kann, werden wir wahrscheinlich in der Lage sein, eine einfache Lösung zu helfen, kommen -. Insbesondere, wenn Sie LINQ mit Cast<T>()
Methode verwenden können
EDIT: Okay, mit HashSet<T>
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Beachten Sie, dass auch bei C # 4 dies notwendig wäre, da der Compiler nicht weiß, dass jeder Wert in baseSet
eine Instanz von DerivedType
ist - es hat eine Ausführungszeitprüfung sein. Die umgekehrte (eine HashSet<BaseType>
von einem HashSet<DerivedType>
erstellen) würde Arbeit in C # 4.
WEITERE EDIT: Wenn Sie nur UnionWith
verwenden möchten, dass erfordert keine HashSet<DerivedType>
- es eine IEnumerable<DerivedType>
erfordert. Ich schlage vor, Sie tun:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Andere Tipps
Hier ist die Lösung
//**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.}
}