Я бы сказал, что это зависит от контракта.
Если в контракте для ReadOnlyText говорится «любая попытка установить Text приведет к исключению», вы, безусловно, нарушаете LSP., у вас все еще есть неловкость в вашем коде: установщик для текста только для чтения.
Это приемлемая «денормализация» при данных обстоятельствах.Я еще не нашел лучшего способа, который не основывается на большом количестве кода.Чистый интерфейс будет в большинстве случаев:
IThingieReader
{
string Text { get; }
string Subtext { get; }
// ...
}
IThingieWriter
{
string Text { get; set; }
string Subtext { get; set; }
// ...
}
... и реализовывать интерфейсы только при необходимости.Однако это ломается, если вам приходится иметь дело с случаями, когда, например, Text
доступен для записи, а Subtext
- нет, и это трудная задача для многих объектов / свойств.