我想创建一个可以在属性中采用不同类型值的类。我正在尝试使用多态性来做到这一点,但我还没有学习如何正确地做到这一点,因此我请求建议。
我有一个基类和两个继承自它的类:
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;
}
}
一切都很好,我可以创建一个列表并添加不同的专业子类。当我需要更改列表中项目的值时,我的问题就出现了:
foreach (var item in ListOfBaseClasses)
{
if(item is DerivedClassFloat)
((DerivedClassFloat) item).Value = float.NaN;
if (item is DerivedClassString)
((DerivedClassString) item).Value = string.Empty;
}
根据我所读到的,这看起来像是一种代码味道。有没有更好的方法可以根据我要分配的类型访问派生类的 value 属性?
当您想根据值创建正确的子类时怎么办?
BaseClass newClass = null;
if (phenotype is DerivedClassFloat)
newClass = new DerivedClassFloat(){Value = 12.2};
if (phenotype is DerivedClassString)
newClass = new DerivedClassString(){Value = "Hello"};
我读过关于覆盖虚拟方法的文章,但是如果我想处理该值,而不是添加或更改它……也许我遗漏了什么?
我应该让这个更具体,我很抱歉,我不习惯在这个伟大的网站上发布问题。
我需要一个由属性列表组成的属性。每个属性都有一个名称和一个值,但该值可以是不同的类型。例如:
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; }
}
对于给定的有机体,我可以有几个属性持有不同的值类型。我想避免使用对象类型,这样我就不必转换为正确的类型。我虽然属性多态是优雅地处理这种情况的解决方案,但后来我发现自己使用 If ..Then 这似乎与一开始的强制转换并没有太大区别。