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