How does EK9 detect duplicate names and properties in type hierarchies?

← Code Quality · Ref: Q739

EK9 rejects a property name that appears twice in a type hierarchy, at compile time.

DUPLICATE PROPERTY FIELD (E02010)

A child record, class, component or dynamic class cannot redeclare a property with the same name as a property anywhere up its super chain, whatever its type. Class and component properties are private, but a redeclared one would still be a second field: the parent's methods would read one copy and the child's methods the other.

JSON ($$) IS COVERED BY THE SAME RULE

Because no name can appear twice in a hierarchy, a generated $$ (to JSON) operator can never meet a duplicate key. There is no separate JSON error: redeclaring the property is E02010 whichever operators are defaulted.

CORRECT PATTERNS

Use distinct names for properties at each level. If a child needs different data, use a different property name. If the parent property is sufficient, access it through inherited methods.

See Q93 for class definition. See Q97 for records vs classes.

Example

#!ek9
defines module qa.codequality.duplicatenames

  defines class

    Employee
      name <- String()
      role <- String()

      Employee()
        ->
          name as String
          role as String
        this.name: name
        this.role: role

      describe()
        <- rtn as String: `${name} (${role})`

      default operator

  defines program

    DuplicateNamesDemo()
      stdout <- Stdout()

      emp <- Employee("Alice", "Engineer")
      stdout.println(emp.describe())
      stdout.println(`Equal: ${emp == Employee("Alice", "Engineer")}`)

Common mistakes

E50060 — EK9 has no toString() method. Use string interpolation or the class's describe() method. See ek9 -h E50060 for details.

Incorrect:

stdout.println(emp.toString())

Correct:

stdout.println(emp.describe())

E50060 — Employee has no getName() method. Use describe() to get employee information. See ek9 -h E50060 for details.

Incorrect:

emp <- Employee("Alice", "Engineer").getName()

Correct:

emp <- Employee("Alice", "Engineer")
Other ways to ask this
  • What is E02010 duplicate property in EK9?
  • Does default operator $$ change whether a child may reuse a parent property name?
  • Why does EK9 reject properties with the same name in parent and child?

Coming from another language?

Java: field shadowing is allowed but produces warnings. Python: attribute shadowing is implicit. Rust: no inheritance, no shadowing. Go: embedding can shadow fields. Kotlin: property override requires explicit 'override' keyword. EK9: duplicate names rejected at compile time, no shadowing allowed.

Keywords: E02010, collision, duplicate, hierarchy, json, name, property, quality, shadow