Frage

Ich habe eine generische Klasse

public class Decoder<SIGNAL> where SIGNAL : signalType, new()

SignalType ist eine abstrakte Klasse. Wie deklare ich ein dynamisches Feld, um es zu speichern? Der folgende Code wirft einen Kompilierfehler aus, der besagt, dass Decoder ein nicht abstrakter Typ generisch sein muss.

public class DecoderParent
{
    private Decoder<signalType> decoder;

    public DecoderParent(keys key)
    {
        switch(key)
    {
        case keys.SignalOne:
            {
                decoder = new Decoder<signalONE>();
                break;
            }
        case keys.signalTwo:
            {
                decoder = new Decoder<signalTWO>();
                }
        }
    }
}
War es hilfreich?

Lösung

Es gibt 2 Probleme, die Sie hier treffen,

  1. Der Typ SignalType verstößt gegen die generische Einschränkung des generischen Parameters von SignalType. Weil es abstrakt ist, kann es die neue () Einschränkung nicht erfüllen
  2. Die Zuordnung zwischen Decoder<signalType> und jeder andere Typ erfordert eine Kovarianzunterstützung, die in C# nicht verfügbar ist (nur in Schnittstellen ab v4.0).

Was Sie tun müssen, ist eine nicht generische Basisklasse zu definieren, die ihre Operationen in den generischen Subklassen vertieft.

public abstract class Decoder {
  ...
  abstract void SomeOp();
} 

public abstract class Decoder<SIGNALTYPE> where SIGNALTYPE : signalType,new() {
}

Decoder d = new Decoder<SignalOne>();

Andere Tipps

Generische Typen sind nicht kovarianten wie Referenztypen - siehe meine Antwort hier. Sie können keinen Decoder zuweisenu003CsignalONE> zu einer Variablen des Typdecodersu003CsignalType>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top