Теперь я ценю, что это на самом деле вопрос, основанный на мнении, поэтому я ожидаю, что он будет закрыт, но, надеюсь, не раньше, чем появятся несколько ответов.Тема, с которой я имею дело, является новой для меня, но также и массивной.Я мог бы провести год здесь и все еще только разбивать верхушку айсберга, поэтому я немного застрял.
Итак, у меня есть ситуация, когда у меня есть три объекта реального мира, давайте назовемих HelloWorld, Foo и Bar.Бар имеет все те же свойства, что и Foo, КРОМЕ для одного.Данное свойство недействительно для бара.Вместо этого у Bar есть дополнительное свойство, уникальное для этого типа.Так что в моей голове Бар имеет смысл унаследовать Фу.Теперь HelloWorld может иметь Foo ИЛИ Bar в зависимости от обстоятельств, и операции будут выполняться по-разному в зависимости от того, какой из них он содержит.
То, что я хочу знать - это то, что приведенный ниже пример содержит воду, или у него есть кодовый запах, похожий на недельную пикшу, оставленную на солнце ?!Если он пахнет, каким будет «правильный» путь?Это все новый код - я не рефакторинг, поэтому у меня есть возможность сделать это правильно с первого раза.
public class Foo
{
// This property is valid for Foo AND Bar
public int Property1 { get; set;}
// This property is valid for Foo ONLY.
public virtual string Property2 { get; set;}
}
public class Bar
{
// This cannot exist in Bar - so always return null, don't allow it to be set.
public new string Property2 => null;
// Unique to Bar.
public List<int> Property3 { get; set;}
}
public class HelloWorld
{
public Foo FooProperty { get; private set;}
private HelloWorld()
{
}
// Create a new object with the property as a Foo.
public static HelloWorldWithFoo()
{
return new HelloWorld()
{
FooProperty = new Foo()
};
}
// Create a new object with the property as a Bar.
public static HelloWorldWithBar()
{
return new HelloWorld()
{
FooProperty = new Bar()
};
}
}
РЕДАКТИРОВАТЬ
Хорошо - такмоему «общему» примеру, возможно, не хватало необходимого контекста - извинения.Взяв на борт комментарии и т. Д., Я применил их вот так - и использовал для ясности типы реального мира.
public class Slot
{
public CardBase CardDetails { get; set; }
private Slot()
{
}
public static Slot CreateSlotWithCard()
{
return new Slot()
{
CardDetails = new Card()
};
}
public static Slot CreateSlotWithCarrierCard()
{
return new Slot()
{
CardDetails = new CarrierCard()
};
}
}
public class CardBase
{
public string Name { get; set; }
public DateTime InstallationDate { get; set; }
public HardwareType Type { get; set; }
}
public class Card : CardBase
{
public List<int> Ports { get; set; }
}
public class CarrierCard : CardBase
{
public List<Card> SubCards { get; set; }
}
Выглядит ли это немного по-правильному? ??