На C#, но может быть применим и к другим языкам, в контексте LSP Как я могу гарантировать, что класс, наследуемый от другого (изменяемого), не нарушит исходный контракт?
Например: если у меня есть установщики свойств public
, internal
или protected
, существует риск того, что наследование классов нарушит исходный контракт. То же самое применимо для virtual
методов.
Это особенно верно, если владелец родительского и наследующего классов не являются одними и теми же лицами, поскольку это может привести к недостатку знаний в контракте и в намерении исходного разработчика.
Является ли неизменность единственным решением или есть другие способы сделать это? Я склонен считать, что наследование соответствует отношению «ведет себя как» вместо отношения «является». Является ли это правильной логической защитой?
Вот пример для иллюстрации:
public class Foo
{
public virtual void DummyMethod(int dummyParameter)
{
if (dummyParameter > 10) { throw new ArgumentOutOfRangeException(); }
}
}
public class Bar : Foo
{
public override void DummyMethod(int dummyParameter)
{
if (dummyParameter < 0) { throw new InvalidOperationException(); }
}
}
Я заметил некоторые другие вопросы, касающиеся этой темы (здесь например), но я ищу общие решения или передовой опыт, чтобы не сталкиваться с этими проблемами заранее.
ArgumentOutOfRangeException
. Если я не владею родительским классом и исключение в родительском классе не задокументировано, есть ли у меня способ избежать такого нарушения контракта? - person Guillaume   schedule 09.09.2012