Я хочу создать класс, который может принимать различные типы значений в свойствах. Я пытаюсь сделать это с помощью полиморфизма, но я еще не научился делать это правильно, поэтому прошу совета.
У меня есть базовый класс и два класса, которые от него наследуются.:
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, что, во-первых, не слишком отличается от приведения типов.