Chain trait delegations so Top delegates to Middle which delegates to Final.

← Sealed Types and Traits · Ref: Q1130

Chain delegators -- each level forwards to the next:

  TopProducer with trait of Producer by delegate
    delegate as Producer?
  MiddleProducer with trait of Producer by delegate
    delegate as Producer?
  FinalProducer with trait of Producer
    override produce() as pure <- result as String: "final"

Calling top.produce() flows: Top -> Middle -> Final.

See Q1129 for basic delegation. See Q1131 for diamond resolution.

Example

defines module qa.sealedtraits.traitdelegationchain

  defines trait

    Producer
      produce() as pure
        <- result as String: "default"

  defines class

    FinalProducer with trait of Producer
      override produce() as pure
        <- result as String: "final"
      default operator ?

    MiddleProducer with trait of Producer by delegate
      delegate as Producer?

      default private MiddleProducer()

      MiddleProducer()
        -> prod as Producer
        require prod?
        delegate := prod

      default operator ?

    TopProducer with trait of Producer by delegate
      delegate as Producer?

      default private TopProducer()

      TopProducer()
        -> prod as Producer
        require prod?
        delegate := prod

      default operator ?

  defines program

    TraitDelegationChainDemo()
      stdout <- Stdout()

      last <- FinalProducer()
      middle <- MiddleProducer(last)
      top <- TopProducer(middle)

      //Call flows: Top -> Middle -> Final
      result <- top.produce()
      stdout.println(`Result: ${result}`)

Common mistakes

E05030 — Use delegation (by keyword) instead of inheritance for chain-of-responsibility patterns.

Incorrect:

    TopProducer extends MiddleProducer

Correct:

    TopProducer with trait of Producer by delegate
      delegate as Producer?
Other ways to ask this
  • I need a multi-level delegation chain where each layer forwards to the next
  • In Java I'd chain decorator objects. Write the EK9 chained trait delegation
  • Given three classes implementing a trait, wire them so calls flow Top -> Middle -> Final
  • Build a delegation pipeline across multiple levels using 'by' keyword

Coming from another language?

Java: Decorator pattern with chained wrappers. Python: decorator chain. Go: nested embedding. EK9: chained 'by delegate' fields.

Keywords: chain, trait, delegation, multi-level, forward, pipeline