OxL Справочник OxL
РусскийEnglish

4.7 Встраивание и переопределение

Наследования реализации нет. Переиспользование — через embed:

oxl
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