Why does EK9 reject override when there is no parent method?

← Classes and OOP · Ref: Q783

Note: override applies to both methods and operators (e.g., override operator ? as pure, override operator $ as pure).

The 'override' keyword in EK9 means 'I am replacing an inherited method from my parent'. If no matching method exists in the parent, the compiler rejects it — you cannot override something that does not exist.

COMMON CAUSES

1. Typo in method name — parent has 'process', child says 'override proccess'
2. Wrong parameter types — parent takes String, child takes Integer
3. Method is private in parent — private methods are not inherited
4. Method does not exist in parent — wrong assumption about inheritance

THIS EXAMPLE

The Logger class has a log() method. The FileLogger overrides it correctly. The format() method is new to FileLogger (no override needed).

WHY THIS MATTERS

The override keyword prevents silent shadowing. Without it, a method with the same name as a parent method would hide the parent version — a common source of bugs. EK9 requires explicit intent.

See Q77 for inheritance. See Q775 for constructor override rules. See Q778 for access modifier rules.

Example

defines module qa.classesandoop.doesnotoverride

  defines class

    Logger as open
      log()
        -> message as String
        stdout <- Stdout()
        stdout.println(message)

      default operator ?

    FileLogger extends Logger

      override log()
        -> message as String
        stdout <- Stdout()
        stdout.println(`[FILE] ${message}`)

      format()
        -> message as String
        <- rtn as String: `[FILE] ${message}`

      default operator ?

  defines program

    ShowLogger()
      logger <- FileLogger()
      if logger?
        logger.log("hello")
        stdout <- Stdout()
        stdout.println(logger.format("formatted"))

Common mistakes

E05110 — The format() method does not exist in the parent Logger class, so 'override' is incorrect. The method is new to FileLogger — remove the override keyword. See ek9 -h E05110 for details.

Incorrect:

      override format()
        -> message as String
        <- rtn as String: `[FILE] ${message}`

Correct:

      format()
        -> message as String
        <- rtn as String: `[FILE] ${message}`

E05110 — The parent has log() but the child says 'override logging()' — the method name does not match any parent method. Fix the typo to match the parent's method name. See ek9 -h E05110 for details.

Incorrect:

      override logging()
        -> message as String

Correct:

      override log()
        -> message as String
Other ways to ask this
  • What triggers E05110 does not override?
  • Why does my override keyword cause an error?
  • How do I correctly override a parent method in EK9?

Coming from another language?

Java: @Override annotation is optional but recommended. Python: no override concept, methods silently shadow. Rust: no override, trait implementations are explicit. Kotlin: override keyword required (same as EK9). Go: no override, methods on embedded structs can be shadowed. EK9: override keyword mandatory when replacing inherited methods.

Keywords: inherit, signature, parent, override, method, shadow, E05110, typo, match