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