Я читал о принципе замещения Лискова (LSP), и я немного смущен тем, как вы правильно его придерживаетесь. Особенно, когда используются интерфейсы и подклассы.
Например, если у меня есть базовый класс:
public abstract class AccountBase
{
private string primaryAccountHolder;
public string PrimaryAccountHolder
{
get { return this.primaryAccountHolder; }
set
{
if (value == null) throw ArgumentNullException("value");
this.primaryAccountHolder = value;
}
}
public string SecondaryAccountHolder { get; set; }
protected AccountBase(string primary)
{
if (primary == null) throw new ArgumentNullException("primary");
this.primaryAccountHolder = primary;
}
}
Теперь предположим, что у меня есть две учетные записи, которые наследуются от базового класса. Тот, который ТРЕБУЕТ SecondaryAccountHolder. Добавление защиты null к подклассу является нарушением LSP, верно? Итак, как мне спроектировать свои классы таким образом, чтобы они не нарушали LSP, но для одного из моих подклассов требуется дополнительный владелец учетной записи, а для другого нет?
Сложите вопрос с тем фактом, что может быть множество разных типов учетных записей, и их нужно будет генерировать через фабрику или фабрику, которая возвращает строителя или что-то в этом роде.
И у меня такой же вопрос с интерфейсами. Если у меня есть интерфейс:
public interface IPrintsSomething
{
void PrintSomething(string text);
}
Не будет ли нарушением LSP добавление защитного предложения null для текста в любом классе, реализующем IPrintsSomething? Как вы защищаете свои инварианты? Это правильное слово, верно? :п