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