Принцип замещения Лискова гласит, что:
Объекты в программе должны заменяться экземплярами их подтипов без изменения правильности этой программы.
При условии, что:
interface Iterable<T> {
fun getIterator(): Iterator<T>
}
interface Collection<T> : Iterable<T> {
val size: Int
}
interface List<T> : Collection<T> {
fun get(index: Int): T
}
interface MutableList<T> : List<T> {
fun set(index: Int, item: T): Unit
}
Когда LSP применяется к входным параметрам, должна применяться абстракция самого низкого уровня:
ДЕЛАТЬ
fun foo(items: Iterable<Any>) { ... }
НЕЛЬЗЯ
fun foo(items: List<Any>) { ... }
Но применяется ли LSP к типам возвращаемых функций, и если да, то применяется ли обратное?
fun bar(): Iterable<Any> { ... }
ИЛИ
fun bar(): List<Any> { ... }