DevPrep

Все темы › Объектно-ориентированное программирование (ООП)

Полиморфизм подтипов и параметрический полиморфизм

Middle

Суть

Это два способа написать код, работающий с «разными типами через один интерфейс», и в Swift у них разная механика и цена.

Пример

// Subtype polymorphism: a value of a subtype is used where the supertype
// is expected. Decided at runtime (vtable / witness table).
protocol Shape { func area() -> Double }
struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let a: Double; func area() -> Double { a * a } }

let shapes: [any Shape] = [Circle(r: 1), Square(a: 2)]
let total = shapes.reduce(0) { $0 + $1.area() }   // existential, dynamic

// Parametric polymorphism: code is written once for any T; the compiler
// specializes it per concrete type (static dispatch, no boxing).
func totalArea<S: Shape>(_ shapes: [S]) -> Double {
    shapes.reduce(0) { $0 + $1.area() }
}
let circles = totalArea([Circle(r: 1), Circle(r: 2)])  // S == Circle

// `some Shape` = opaque type: parametric for the caller, one concrete type.
func makeShape() -> some Shape { Circle(r: 3) }

Когда что выбирать

На что смотрит интервьюер

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store