У меня есть несколько классов, которые все связаны концептуально, но некоторые более-менее на уровне деталей, чем другие. Например, эти три класса имеют почти идентичные свойства (хотя функции-члены будут различаться):
public class RelatedA : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
}
public class RelatedB : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
}
public class RelatedC : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
public int Special { get; set; }
}
Есть пара других классов, которые концептуально связаны с вышеупомянутыми 3, но могут быть немного другими в реализации:
public class RelatedD : IRelatedType
{
public string Name { get; set; }
public string Statement { get; set; }
}
public class RelatedE : IRelatedType
{
public string Name { get; set; }
public string Statement { get; set; }
public bool IsNew { get; set; }
}
Их экземпляры могут быть созданы фабрикой на основе какого-либо перечисляемого значения типа. Проблема в том, что позже, когда эти объекты используются (например, на бизнес-уровне), может быть много кода, подобного этому:
IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue);
if (theObject is RelatedC)
{
RelatedC cObject = theObject as RelatedC;
specialVal = cObject.Special;
}
else if (theObject is RelatedD)
{
RelatedD dObject = theObject as RelatedD;
statementVal = dObject.Statement;
}
else if (theObject is RelatedE)
{
RelatedE eObject = theObject as RelatedE;
statementVal = eObject.Statement;
isNewVal = eObject.IsNew;
}
Это можно повторить во многих местах. Есть ли лучший подход к дизайну, который я должен использовать (должен быть)?