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

War es hilfreich?

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.}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top