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

#!ek9
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: E05110, inherit, match, method, override, parent, shadow, signature, typo