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