【问题标题】:C# List of different types of objects derivated from same parent and custom propertiesC# 从相同父级和自定义属性派生的不同类型对象的列表
【发布时间】:2020-05-08 11:14:45
【问题描述】:

我正在尝试创建从同一父级派生的不同类型对象的列表并访问其自定义属性。

这些是我的课程:

    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 也可以是表示复数、矩阵等的类。

我已阅读有关协变和逆变的内容,但我不明白这对我有何帮助。

感谢您的帮助。

【问题讨论】:

  • 如果您可以手动枚举所有类型,您可以通过switch 语句使用pattern matching
  • 您能否发布一个更实际的示例,说明您希望如何使用 Value ?或者至少描述一下?这对解决您的问题很重要。有几种方法可以解决它。我猜你想要的不仅仅是将它打印到控制台
  • Console.WriteLine(signal.Value) 是你想如何使用的坏例子。仅打印字符串 - 使用与 ToString 类似的方法:将抽象方法添加到返回字符串的基类。
  • 您可能对该值有非常依赖上下文的用法。请发布 2 个不同的上下文,您将在其中使用该值。
  • @MongZhu 和 Sinatr 你们都是对的,我错过了我的问题的上下文(这是我在 stackoverflow 中的第一个问题,我不想让事情变得复杂)。事实上,我不仅需要能够阅读“价值”,还需要能够写出它。即使我知道 c# 是强类型语言,我也将其视为 python 范例。

标签: c# inheritance collections covariance


【解决方案1】:

这是因为

当你循环时

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

类型是信号

你现在没有财产。

你需要做什么询问它是否可以成为别的东西,

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);
   }
}

这应该有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2020-07-13
    • 1970-01-01
    • 2018-11-03
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多