c# - 通用类多态性

标签 c# .net oop generics polymorphism

如果我有以下内容:

public abstract class Parameter<T>  
{
    protected T value;

    public virtual T Value
    {
        get { return value; }
        set { this.value = value; }
    }

    protected Parameter(T startingValue)
    {
        value = startingValue;
    }
}

public class FloatParameter : Parameter<float> 
{
    public FloatParameter(float startingValue) : base(startingValue){}
}

public class IntParameter : Parameter<int> 
{
    public override int Value
    {
        get { return value; }
        set { this.value = value > 100 ? 100 : value; }
    }

    public IntParameter(int startingValue) : base (startingValue) {}
}

有没有办法创建一些List<Parameter>可以包含任何派生类型?例如,像这样的东西:

// no type specified in Parameter
List<Parameter> storedParameters = new List<Parameter>(); 
storedParameters.Add(new FloatParameter(2f));
storedParameters.Add(new IntParameter(7));

foreach(Parameter p in storedParameters)
{
    DoSomethingWithValue(p.Value);
}

或者,如果这个实现有缺陷,是否有更好的方法来做到这一点?我在这里的内容感觉有点幼稚。

最佳答案

我看到管理这种情况的唯一方法是拥有和用于管理泛型类型的接口(interface),这样的事情应该有效:

public interface IParameter
{
    void DoSomething();
}

public abstract class Parameter<T>
{
    protected T value;

    public T Value
    {
        get { return value; }
        set { this.value = value; }
    }

    protected Parameter(T startingValue)
    {
        value = startingValue;
    }
}

public class FloatParameter : Parameter<float>, IParameter
{
    public FloatParameter(float startingValue) : base(startingValue) { }
    public void DoSomething()
    {
        Console.WriteLine(value);
    }
}

public class IntParameter : Parameter<int>, IParameter
{
    public IntParameter(int startingValue) : base(startingValue) { }

    public void DoSomething()
    {
        Console.WriteLine(value);
    }
}

在他的情况下,您将能够创建一个接口(interface) IParameter 列表并在其中添加特定实例:

 var list = new List<IParameter>();
 list.Add(new FloatParameter(1F));
 list.Add(new IntParameter(1));

 foreach (var item in list)
 {
      item.DoSomething();
 }

关于c# - 通用类多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43045387/

相关文章:

.net - 如何根据 Visual Studio 版本将 sql server 单元测试项目指向 localdb?

c# - 带有 Visual Studios 2010 的 .NET 4.0 中的 ONVIF 身份验证

java - 在 Java 中与基于文本的游戏中的其他对象交互

c# - 将 JSON 字符串中的数据覆盖到现有对象实例

c# - 如何使用具有多个属性的集合在 Dapper 中进行过滤?

c# - ClickOnce 开始菜单图标

ruby - 命名 Ruby 方法

c# - 无法连接到 SQL Server session 数据库异常 - 所有池连接都在使用中

c# - 如何使用 Fiddler(script) 编辑 URL?

java - 为什么 SocketChannel 是抽象的?