Заменяемость - это принцип объектно-ориентированного программирования утверждая, что в компьютерной программе , если S является подтипом из T, то объекты типа T могут быть заменены объектами типа S ( т. е. объект типа T может быть заменен любым объектом подтипа S) без изменения каких-либо желаемых свойств программы (правильность, выполненная задача и т. д.). Более формально, L Принцип подстановки исков (LSP ) - это конкретное определение отношения подтипов, называемое (сильное ) поведенческое подтипирование, которое изначально было введено Барбара Лисков в докладе конференции 1987 года, озаглавленном «Абстракция данных и иерархия». Это семантическое, а не просто синтаксическое отношение, поскольку оно призвано гарантировать семантическую совместимость типов в иерархии, в частности типов объектов. Барбара Лисков и Жаннетт Винг кратко описали принцип в статье 1994 года следующим образом:
Требование к подтипу: Пусть быть доказуемым свойством для объектов типа T. Тогда должно быть истинным для объектов типа S, где S является подтипом T.
В той же статье Лисков и Винг подробно описали свое понятие поведенческого подтипирования в расширении логики Хоара, которая имеет определенное сходство с проектом Бертрана Мейера по контракту тем, что учитывает взаимодействие подтипов с предварительные условия, постусловия и инварианты.
Понятие Лискова поведенческого подтипа определяет понятие заменяемости объектов; то есть, если S является подтипом T, то объекты типа T в программе могут быть заменены объектами типа S без изменения каких-либо желаемых свойств этой программы (например, корректность ).
Поведенческий подтип - более сильное понятие, чем типичное подтипирование функций, определенное в теории типов, которое полагается только на контравариантность типов аргументов и ковариация возвращаемого типа. Поведенческий подтип является неразрешимым в целом: если q является свойством «метод для x всегда завершается », то программа (например, компилятор) не может проверить его истинность. для некоторого подтипа S из T, даже если q действительно выполняется для T. Тем не менее, этот принцип полезен при рассуждении о структуре иерархий классов.
Принцип Лискова налагает некоторые стандартные требования на сигнатуры, которые были приняты в новых объектно-ориентированных языках программирования (обычно на уровне классов, а не типов; см. номинальные и структурные подтип для различия):
В дополнение к требованиям подписи подтип должен соответствовать ряду поведенческих условий. Они подробно описаны в терминологии, напоминающей терминологию методологии проектирование по контракту, что приводит к некоторым ограничениям на то, как контракты могут взаимодействовать с наследованием :
Правила для предварительных и постусловий идентичны правилам, введенным Бертраном Мейером в его книге 1988 года Построение объектно-ориентированного программного обеспечения. И Мейер, и позже Пьер Америка, который первым использовал термин «поведенческий подтип», дали теоретико-доказательственные определения некоторых понятий поведенческого подтипа, но в их определениях не учитывались псевдонимы это может произойти в языках программирования, которые поддерживают ссылки или указатели. Важным усовершенствованием, сделанным Лисковым и Уингом (1994), стал учет наложения спектров, а ключевым элементом является историческое ограничение. Согласно определениям Мейера и Америки, MutablePoint будет поведенческим подтипом ImmutablePoint, тогда как LSP запрещает это.
Хотя широко используется, характеристика поведенческого подтипа как способности заменять объекты подтипа на объекты супертипа считается ошибочной. В нем не упоминаются спецификации, поэтому предлагается неправильное чтение, когда реализация супертипа сравнивается с реализацией подтипа. Это проблематично по нескольким причинам, одна из которых заключается в том, что он не поддерживает общий случай, когда супертип является абстрактным и не имеет реализации. Кроме того, более тонко, в контексте объектно-ориентированного императивного программирования трудно точно определить, что означает универсальная или экзистенциальная количественная оценка объектов данного типа или замена одного объекта другим. При применении подтипов обычно мы не заменяем объекты подтипа на объекты супертипа, мы просто используем объекты подтипа как объекты супертипа. То есть это те же объекты, объекты подтипа, которые также являются объектами супертипа.
В интервью в 2016 году сама Лисков объясняет, что то, что она представила в своем программном выступлении, было «неформальным правилом», что Жаннетт Винг позже предложила им «попытаться точно выяснить, что это означает», что привело к к их совместной публикации о поведенческих подтипах, и действительно, что «технически это называется поведенческим подтипом». Во время интервью она не использует замещающую терминологию для обсуждения концепций.
Общие ссылки
Особые ссылки