4.7 Встраивание и переопределение
Наследования реализации нет. Переиспользование — через embed:
data Animal { name: str }
impl Animal {
open fn speak() -> str => "..."
fn hello() -> str => "I am {name}: {speak()}"
}
data Dog { embed Animal; breed: str }
impl Dog { override fn speak() -> str => "Woof, {super.speak()}" }
Dog{ name: "Rex", breed: "lab" }.hello() // "I am Rex: Woof, ..."embed Tделает поля и методыTдоступными у внешнего типа (продвижение).- Переопределить можно только метод, объявленный в
Tкакopen fn. Переопределение ДОЛЖНО иметь словоoverrideи идентичную сигнатуру;overrideбезopen— ошибка. - Вызов
open-метода черезselfвнутри методовTдиспетчеризуется на переопределение внешнего типа. Не-openметоды связываются статически. super.m()вызывает версию встроенного типа; при нескольких встраиваниях —super(Animal).m().- Конфликт продвигаемых имён двух встраиваний — ошибка при использовании, пока имя не переопределено или не указано явно (
self.Animal.name). Dogне является подтипомAnimal; доступ к части —dog.Animal(&Animal).Dogудовлетворяет интерфейсам, которым удовлетворяетAnimal, через продвинутые методы.
Связанные диагностики
ambiguous-embed, missing-override, override-without-open
См. также
Исходник: docs/spec/oxl-standard.md