如何创建和设置多态属性?

Luc*_*ano 7 c# polymorphism design-patterns

我想创建一个可以在属性中使用不同类型值的类.我正在尝试使用多态,但我还没有学习如何正确地做到这一点,因此我的建议请求.

我有一个基类和两个继承它的类:

public abstract class BaseClass
{
    public string Name { get; set; }
    public Unit Unit { get; set; }
}

public class DerivedClassFloat : BaseClass
{
    public float Value { get; set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

public class DerivedClassString : BaseClass
{
    public string Value { get; set; }

    public override string ToString()
    {
        return Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,我可以创建一个List并添加不同的专用子类.当我需要更改列表中项目的值时,我的问题出现了:

foreach (var item in ListOfBaseClasses)
{
   if(item is DerivedClassFloat)
     ((DerivedClassFloat) item).Value = float.NaN;
   if (item is DerivedClassString)
      ((DerivedClassString) item).Value = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

根据我所读到的,这看起来像代码味道.有没有更好的方法来根据我尝试分配的类型访问派生类的value属性?

当你想根据值创建正确的子类时呢?

BaseClass newClass = null;
if (phenotype is DerivedClassFloat)
    newClass = new DerivedClassFloat(){Value = 12.2};
if (phenotype is DerivedClassString)
    newClass = new DerivedClassString(){Value = "Hello"};                      
Run Code Online (Sandbox Code Playgroud)

我读过有关覆盖虚拟方法的内容,但是如果我想处理该值,而不是添加或更改它,那就有效...也许我错过了什么?


我应该更加具体,道歉,我不习惯在这个伟大的网站上发帖提问.

我需要一个由属性列表组成的属性.每个属性都有一个名称和一个值,但值可以是不同的类型.例如:

public class Organism
{
    public string Name { get; set; }
    public List<Attribute> Attributes { get; set; }
}

public class Attribute
{
    public string AttributeName { get; set; }
    public object AttributeValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

对于给定的生物,我可以有几个属性持有不同的值类型.我想避免使用对象类型,这样我就不必转换为正确的类型.我虽然属性多态性是优雅地处理这种情况的解决方案,但后来我发现自己使用If ..然后,这似乎与首先铸造没有太大不同.

Adi*_*ter 2

如果在您的特定情况下您想要重置Value,您可以在基类中定义一个抽象ResetValue方法,该方法将由派生类实现。

至于第二种情况,您应该查看创建设计模式,特别是工厂和原型设计模式。