Search code examples
scalascala-2.9

how to force method to be implemented in concrete subclass from trait


I have a method in my trait

def controller: AnyRef

but my concrete class was not implementing that method and it was still compiling. The compiler doesn't let me add abstract to that method either. How can I create a method in a trait that forces it's implementer to implement it?

thanks, Dean


Solution

  • The compiler enforces that concrete classes implement all the abstracts methods they inherit from superclasses and traits.

    If your class was compiling it meant it wasn't concrete, i.e. it was a trait or an abstract class, and you can't force neither to implement the abstract method.

    Of course, as soon as you try to obtain a concrete instance the compiler will raise an error as the method is not implemented.

    Practical example in the REPL

    scala> trait A { def controller: AnyRef }
    defined trait A
    
    scala> trait B extends A
    defined trait B
    
    scala> abstract class C extends A
    defined class C
    
    scala> class D extends A
    <console>:8: error: class D needs to be abstract, since method controller in trait A of type => AnyRef is not defined
           class D extends A
    
    scala> new B { }
    <console>:10: error: object creation impossible, since method controller in trait A of type => AnyRef is not defined
                  new B { }
                      ^
    
    scala> new C
    <console>:10: error: class C is abstract; cannot be instantiated
                  new C