DevPrep

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

Множественное наследование и интерфейсы

Middle

Суть

Множественное наследование — когда класс наследует реализацию от нескольких родителей (C++, Python). Главная проблема — diamond problem: D наследует B и C, оба наследуют A и переопределяют один метод; какой вариант получит D, и сколько копий состояния A у него будет? Из-за этой неоднозначности и хрупкости большинство языков множественное наследование классов запретили.

Как решают языки

Diamond в Swift и как он разрешается

protocol Flying { func move() -> String }
protocol Swimming { func move() -> String }
extension Flying { func move() -> String { "fly" } }
extension Swimming { func move() -> String { "swim" } }

struct Duck: Flying, Swimming {
    // Without this the call `Duck().move()` is ambiguous: two defaults.
    func move() -> String { "fly or swim" }
}

print(Duck().move())                     // fly or swim
print((Duck() as any Flying).move())     // fly or swim: requirement overridden

Если Duck не реализует move() сам, компилятор выдаст ошибку неоднозначности — конфликт решается явно, а не правилами порядка, как в C++ или Python (MRO).

Почему протоколы безопаснее

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

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

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

Скачать DevPrep в App Store