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

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, sealed, restricted