Принцип замещения Лискова гласит:
Объекты в программе должны заменяться экземплярами их подтипов без изменения правильности этой программы.
Предполагая, что:
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 применяется к входным параметрам, должна применяться абстракция самого низкого уровня:
DO
fun foo(items: Iterable<Any>) { ... }
DO NOT
fun foo(items: List<Any>) { ... }
Но применяется ли LSP к типам возвращаемых функций, и если да, применяется ли обратное?
fun bar(): Iterable<Any> { ... }
OR
fun bar(): List<Any> { ... }