Delegate operators through a trait so the delegating class supports $ and ?.

← Sealed Types and Traits · Ref: Q1133

Trait delegation with 'by' forwards methods AND operators:

  Wrapper with trait of Printable by delegate
    delegate as Printable?

If the trait defines operators (via default operator or explicit), the delegating class forwards them to the delegate.

See Q1129 for basic delegation. See Q1130 for chained delegation.

Example

defines module qa.sealedtraits.traitoperatordelegation

  defines trait

    Printable
      describe() as pure
        <- rtn as String: "default"

  defines class

    RealPrinter with trait of Printable
      override describe() as pure
        <- rtn as String: "RealPrinter"
      default operator ?

    //Delegates all trait members including operators
    PrinterWrapper with trait of Printable by delegate
      delegate as Printable?

      default private PrinterWrapper()

      PrinterWrapper()
        -> printer as Printable
        require printer?
        delegate := printer

      default operator ?

  defines program

    TraitOperatorDelegationDemo()
      stdout <- Stdout()

      real <- RealPrinter()
      wrapper <- PrinterWrapper(real)

      //Delegated method call
      stdout.println(wrapper.describe())

      //Operator ? works through delegation
      stdout.println(`Wrapper set?: ${wrapper?}`)

Common mistakes

E01010 — Use 'by delegate' to automatically forward all trait members including operators. No manual forwarding needed.

Incorrect:

    Wrapper with trait of Printable
      delegate as Printable
      operator $ as pure <- rtn as String: $delegate

Correct:

Wrapper with trait of Printable by delegate
      delegate as Printable?
Other ways to ask this
  • I need a wrapper class that delegates not just methods but also operators via a trait
  • In Kotlin 'by' delegates interface methods. Show EK9 trait operator delegation
  • Given a trait with operators, create a delegating class that forwards them
  • Make a delegating wrapper support $ string and ? isSet through its delegate

Coming from another language?

Kotlin: class Wrapper(p: Printable): Printable by p — delegates methods and properties. EK9: 'with trait of X by field' — delegates methods and operators.

Keywords: delegation, trait, operator, by, forward, $, ?