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)

The sameness follows its own rules:

  '==' or '<=>'                  inherited, or (below per-type sameness) declared anew: taking the subtype it is a new operator, no override; taking the parent type it is 'override operator'; below hierarchy-wide sameness (written by hand on an ABSTRACT base or a trait) it cannot be redefined (E07182)
  '<>', '<', '<=', '>', '>='     always generated from the sameness, never written (E07181)
  '#?'                           goes with the sameness (E07184): inherited with it, or 'override operator #?' beside a subtype's own '==' / '<=>'

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

#!ek9
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, E05120, always, isSet, list, operator, override