Implement a Describable trait with a name method in a concrete Animal class.
← Sealed Types and Traits · Ref: Q1176
Implement a trait with 'with trait of' and override abstract methods:
Dog with trait of Describable override describe() <- rtn as String: `Dog: ${name}`
Use 'override' on every abstract trait method. The trait can have a default method that the class inherits without overriding.
See Q106 for trait basics. See Q108 for implementing traits. See Q1129 for trait delegation.
Example
#!ek9 defines module qa.sealedtraits.traitwithclass defines trait Describable describe() as abstract <- rtn as String? summary() as pure <- rtn as String: "No summary available" defines class Dog with trait of Describable name <- String() Dog() -> name as String this.name: name override describe() <- rtn as String: `Dog: ${name}` override operator ? as pure <- rtn as Boolean: name? default operator defines program TraitWithClassDemo() stdout <- Stdout() dog <- Dog("Rex") stdout.println(dog.describe()) stdout.println(dog.summary()) stdout.println(`IsSet: ${dog?}`)
Common mistakes
E05120 — When implementing a trait's abstract method, the 'override' keyword is mandatory. Omitting it triggers E05120.
Incorrect:
describe()
<- rtn as String: `Dog: ${name}`
Correct:
override describe() <- rtn as String: `Dog: ${name}`
Other ways to ask this
- Write code to define a trait and implement it in a class with a constructor
- I need a class that fulfils a Describable contract with name and describe methods
- In Java I'd implement an interface on a class. Write the EK9 trait implementation
- Given a Describable trait with describe(), create a Dog class that provides the implementation
Coming from another language?
Java: class Dog implements Describable. C#: class Dog : IDescribable. Python: class Dog(Describable). Kotlin: class Dog : Describable. EK9: Dog with trait of Describable, override methods.
Keywords: abstract, class, describe, implement, override, trait, with trait of