2009-09-24 5 views
1

У меня есть общий классДженерики вопрос

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

signalType является абстрактным классом. Как объявить динамическое поле для его сохранения? Следующий код вызовет ошибку компиляции, указав, что декодер должен быть не абстрактным типом.

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>(); 
       } 
     } 
    } 
} 
+3

Чтобы следовать лучшим методам, 'SIGNAL' должен быть' TSignal'. – jason

ответ

4

Есть 2 проблемы вы удар здесь

  1. Типа signalType нарушает общее ограничение на SIGNALTYPE общего параметре. Поскольку он абстрактный, он не может удовлетворить ограничение new()
  2. Назначение между Decoder<signalType> и любым другим типом требует поддержки ковариации, которая недоступна в C# (только в интерфейсах, начиная с версии 4.0).

Что вам нужно сделать, это определить базовый класс, не относящийся к общим классам, который отбрасывает его операции на общие подклассы.

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

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

Decoder d = new Decoder<SignalOne>(); 
+0

отлично поработал, за исключением того, что я не мог использовать общие определения методов. Например: public override List GetList(); – Will

1

Обобщенные типы не ковариантны как ссылочные типы - см мой ответ here. Вы не можете присваивать Декодера <signalONE> к переменному типу Decoder <signalType>

Смежные вопросы