Generate all operators with default, but customise the string representation.
← Operators and Expressions · Ref: Q1098
Override before default:
override operator $ as pure <- rtn as String: `Custom(age=${age})` default operator
Overrides go BEFORE 'default operator', which must be last in the class body. See Q1069 for mixing default with overrides, Q1097 for default operator basics.
Example
defines module qa.operators.overrideafterdefault defines class Base as open name as String: String() Base() -> name as String this.name :=? name default operator Child extends Base age as Integer: Integer() Child() -> childName as String age as Integer super(childName) this.age :=? age //Custom $ BEFORE default operator override operator $ as pure <- rtn as String: `Child(age=${age})` default operator defines program OverrideAfterDefaultDemo() stdout <- Stdout() base <- Base("ParentObj") stdout.println($base) child <- Child("ChildObj", 10) stdout.println($child)
Common mistakes
E01086 — default operator must be LAST. Put override operators BEFORE it.
Incorrect:
default operator override operator $ as pure <- rtn as String: `Custom`
Correct:
override operator $ as pure <- rtn as String: `Child(age=${age})`
Other ways to ask this
- I want default operator for everything except $ which I need to customise
- In Java I'd auto-generate equals/hashCode but override toString(). Write the EK9 way
- Given a child class, override the parent's default $ with a custom format
- Use default operator for most operators but provide a custom override operator $
Coming from another language?
Java: Lombok @Data + manual toString(). Kotlin: data class + override fun toString(). EK9: override operator $ before default operator.
Keywords: string, $, customise, combine, override, default operator