Which operators always need the override keyword in EK9?
← Override Mechanics · Ref: Q1070
The operator ? ALWAYS needs override on any class. Every class inherits operator ? from its root type, so your definition always overrides it.
ALWAYS needs override:
override operator ? as pure every class inherits this
Needs override only when a PARENT type declares it:
override operator $ as pure if a parent has $ (beside 'default operator' with no parent $, it takes no override - E05110)
NEVER overridden - sameness is declared once per type hierarchy:
'==' or '<=>' a subtype inherits it and cannot redefine it (E07182) '<>', '<', '<=', '>', '>=' always generated from the sameness, never written (E07181) '#?' goes with the sameness: a subtype inherits it with '==' / '<=>' (E07184)
Does NOT need override (no parent version exists):
operator $ as pure if no parent declares $ operator #^ as pure promote — rarely inherited operator ++ / += / -= mutation operators operator :=: / :~: / :^: copy/merge/replace
Simple rule: if the compiler says E05120, add override. If it says E05110, remove override.
E05120 = override required (parent has this operator)
E05110 = override not valid (parent does NOT have this operator)
See Q1068 for the E05120 fix. See Q1069 for mixing default operator with overrides.
Example
defines module qa.overridemechanics.overridealways defines class //operator ? ALWAYS needs override Account accountId as Integer: 0 default private Account() Account() -> accountId as Integer this.accountId :=: accountId override operator ? as pure <- rtn as Boolean: accountId? //operator $ does NOT need override here (no parent $) operator $ as pure <- rtn as String: `Account-${accountId}` defines program OverrideAlwaysDemo() stdout <- Stdout() acct <- Account(1001) stdout.println(`Set: ${acct?}`) stdout.println(`${acct}`)
Common mistakes
E05120 — operator ? always needs 'override' because every class inherits it from its base type.
Incorrect:
operator ? as pure <- rtn as Boolean: accountId?
Correct:
override operator ? as pure <- rtn as Boolean: accountId?
Other ways to ask this
- When do I need to write override before an operator?
- Does operator $ need override?
- List all operators that require override in EK9
Coming from another language?
Java: @Override is optional but recommended. EK9: override is mandatory — the compiler enforces it.
Keywords: E05110, operator, always, E05120, isSet, override, list