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 when parent defines it OR default operator generates it:

  override operator $ as pure    if parent has $ or default operator was used
  override operator == as pure   if parent has == or default operator was used
  override operator <> as pure   if parent has <>
  override operator <=> as pure  if parent has <=>
  override operator #? as pure   if parent has #?

Does NOT need override (no parent version exists):

  operator $ as pure             if no parent $ and no default operator
  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)

for 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: name?

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: E05120, always, operator, E05110, list, override, isSet