Create a dynamic class with multiple methods implementing a trait inline.

← Advanced Type System · Ref: Q1127

Override multiple abstract methods in a dynamic class:

  obj <- () with trait of Speaker as class
    override greet() as pure
      <- rtn as String: "Hello"
    override farewell() as pure
      <- rtn as String: "Goodbye"
    default operator ?

Every abstract method in the trait must be overridden in the dynamic class body.

See Q1125 for dynamic functions. See Q1126 for dynamic class with capture.

Example

defines module qa.advancedtypes.dynamicclassmethods

  defines trait

    Speaker
      greet() as pure abstract
        <- rtn as String?
      farewell() as pure abstract
        <- rtn as String?

  defines program

    DynamicClassMethodsDemo()
      stdout <- Stdout()

      speaker <- () with trait of Speaker as class
        override greet() as pure
          <- rtn as String: "Hello"
        override farewell() as pure
          <- rtn as String: "Goodbye"
        default operator ?

      stdout.println(speaker.greet())
      stdout.println(speaker.farewell())

Common mistakes

E01075 — EK9 has no 'new' keyword — instantiate a type by calling its constructor directly, e.g. Stdout(). See ek9 -h E01075 for details.

Incorrect:

      stdout <- new Stdout()

Correct:

      stdout <- Stdout()
Other ways to ask this
  • I need an inline class that implements two abstract methods from a trait
  • In Java I'd use an anonymous class with multiple method overrides. Write the EK9 way
  • Given a trait with greet() and farewell(), create a one-off inline implementation
  • Build a dynamic class that overrides multiple trait methods

Coming from another language?

Java: anonymous inner class with multiple method overrides. Kotlin: object expression. Python: lambda (single method only). EK9: dynamic class implementing full trait.

Keywords: inline, dynamic, trait, class, multiple, methods