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