Выбор ответа Middle Функции, расширения и scope-функции обновлено

Член класса или расширение: что вызовется

Вопрос

У класса есть метод fun greet() = "member", и объявлено расширение fun Person.greet() = "extension". Что вернёт person.greet()?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: "member", член класса всегда побеждает. Если у класса есть член с подходящей сигнатурой, он всегда выигрывает у расширения, а компилятор предупредит, что расширение затенено (extension is shadowed by a member).

Варианты ответа

  1. "extension", расширение объявлено позже
  2. Ошибка компиляции: неоднозначный вызов
  3. Зависит от того, импортировано ли расширение
  4. "member", член класса всегда побеждаетправильный ответ

Разбор

Если у класса есть член с подходящей сигнатурой, он всегда выигрывает у расширения, а компилятор предупредит, что расширение затенено (extension is shadowed by a member). Поэтому расширением нельзя «переопределить» поведение чужого класса. Расширение сработает только для другой сигнатуры, например с другими параметрами.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.