C# Список различных типов объектов, производных от одних и тех же родительских и настраиваемых свойств - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать список объектов разных типов, производных от одного и того же родителя, и получить доступ к его настраиваемым свойствам.

Это мои классы:

    abstract class Signal
    {
    }

    abstract class Signal<T>:Signal
    {
        public T Value { get ; set; }

         public Signal(T value)
        {
            Value = value;
        }
    }

    class scalar_signal : Signal<int>
    {
        public scalar_signal(int value):base(value)
        {
        }
    }

    class array_byte_signal: Signal<byte[]>
    {
        public array_byte_signal(byte[] value):base(value)
        {
        }
        public override string ToString()
        {
            return string.Join("; ", Value);
        }
    }

А это моя программа:

    static void Main(string[] args)
    {
        var signals = new List<Signal>();

        signals.Add(new scalar_signal(3));
        signals.Add(new array_byte_signal(new Byte[] { 0, 1 }));

        foreach (var signal in signals)
        {
            Console.WriteLine(signal.Value); //Compilation error: Value is not defined in Signal
        }
    }

Как видите, я могу создать список различных типов сигналов, но не могу получить доступ к их свойствам.

Мне действительно нужно иметь только один список (или любую другую коллекцию) со всеми моими сигналами, потому что позже их будет легче обрабатывать. типа T. T также может быть классом, представляющим комплексное число, матрицу и т. д. c.

Я читал о ковариации и контравариантности, но не понимаю, как это может мне помочь.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 мая 2020

это потому, что

, когда вы зацикливаете

foreach (var signal in signals)
{
     Console.WriteLine(signal.Value); //Compilation error: Value is not defined in Signal
}

, типом является Signal

, у которого теперь нет свойства.

what you нужно сделать это спросить, может ли это быть что-то еще,

foreach (var signal in signals)
{
   //#6
   if(signal  is scalar_signal)
   {
       var typeCast = (scalar_signal)signal;
       Console.WriteLine(typeCast .Value);
   }

   //#7.2 +
   if(signal  is scalar_signal valueTypeName)
   {
       Console.WriteLine(valueTypeName.Value);
   }
}

это должно помочь

...