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