Нищо не разбрах, дай пак. В Уикирастията е обяснено още по-малоумно.
От гледна точка на клиентския код приемащ инстанция на някакъв клас не би трябвало да има значение дали инстанцията е на тоя клас или някой наследник. Както синтактично така и семантично, примерно ако имаш база Shape с метод draw и подадеш окръжност, се очаква да бъде изчертана, тоя принцип казва че ако подадеш Rect не би трябвало от монитора да изскочи некъв уй и да те изпляска по челото а само правоъгълника кротко да се изчертае.aping.
Действително е изнасилено нещо толкова очевидно да се изкарва като SUBSTITUTION PRINCIPLE ама то в оопето изнасилени неща да иска човек :)
Е! Това не се ли казва "полиморфизъм"??? Какви са тия "субститушън принципи"???
Много хора се бъркат, защото масово старите програмните езици не правят разлика между inheritance и subtyping. Правилото на Лисков, служи да ти напомни да ползваш subtyping, защото inheritance е дете на дявола. Поради тази причина в съвременните езици няма inheritance, има само subtyping.
Какво е subtyping: отнася се за съвместимостта на интерфейсите - Ако Б е подтип на А, то върху Б трябвада може да извикаш всяка функция, която може да извикаш на А, като не променяш контракта. На джаварски може да се каже, че събтайпинга е да имплементираш някъв интерфейс.
Какво е inheritance: отнася се за преизползването на код - примерно функциите на тип Б са имплементирани чрез функциите на тип А. Ясно е че ако наследиш някакъв клас той получава достъп до protected + public методите на родителския клас. До голяма степен (без protected) същото се постига и чрез композиция, но с добавения плюс, че не си замърсяваш типа.
Прост пример: имаш клас 2ДТочка(х, у). Може да направиш 3ДТочка като наследиш 2ДТочка и добавиш още едно поле за Z. Обаче така чупиш контракта на hashcode/equals. Езика ти позволява да подадеш указател към 3ДТочка, там където се очаква указател към 2Дточка, защото имаш отношение is-a: демек 3Д точката е 2Д точка. Виждаш ли проблема ?