Define a sealed Shape class that permits only Circle, Square, and Triangle.

← Sealed Types and Traits · Ref: Q1171

Seal with 'allow only' and list permitted subtypes:

  Shape allow only Circle, Square, Triangle as open
    area()
      <- rtn as String: "Shape"
  Circle extends Shape
    override area()
      <- rtn as String: "Circle"

Only the listed types can extend Shape. The compiler rejects any other subclass.

See Q298 for sealed traits. See Q1121 for dispatching on sealed types.

Example

#!ek9
defines module qa.sealedtraits.sealedclassbasic

  defines class

    Shape allow only Circle, Square, Triangle as open
      area()
        <- rtn as String: "Shape"

    Circle extends Shape
      override area()
        <- rtn as String: "Circle"

    Square extends Shape
      override area()
        <- rtn as String: "Square"

    Triangle extends Shape
      override area()
        <- rtn as String: "Triangle"

  defines program

    SealedClassBasicDemo()
      stdout <- Stdout()

      circle <- Circle()
      square <- Square()
      triangle <- Triangle()

      stdout.println(circle.area())
      stdout.println(square.area())
      stdout.println(triangle.area())

Common mistakes

E05240 — A sealed class listing 'allow only Circle, Square' forbids Triangle from extending it — every permitted subtype must appear in the allow-only list. See ek9 -h E05240 for details.

Incorrect:

    Shape allow only Circle, Square as open

Correct:

    Shape allow only Circle, Square, Triangle as open
Other ways to ask this
  • Restrict which classes can extend Shape using 'allow only'
  • I need a closed hierarchy where only specific subclasses are allowed
  • In Kotlin I'd use a sealed class. Write the EK9 sealed class equivalent
  • Given a Shape base, lock it down so no other subclass can be added

Coming from another language?

Kotlin: sealed class Shape. Java 17: sealed class Shape permits Circle, Square. Rust: enum Shape { Circle, Square }. EK9: Shape allow only Circle, Square as open.

Keywords: allow only, class, closed, hierarchy, restricted, sealed