4

Is there a way to specify that a trait has to provide a concrete implementation of a method?

Given some mixin

class A extends B with C {
  foo()
}

The program will compile if either of A, B, or C implements foo(). But how can we force, for example, B to contain foo's implementation?

0

1 Answer 1

10

You can do the following:

class A extends B with C {
  super[B].foo()
}

This will only compile if B implements foo. Use with caution though as it (potentially) introduces some unintuitive coupling. Further, if A overrides foo, still B's foo will be called.

One IMHO valid use case is conflict resolution:

trait B { def foo() = println("B") }
trait C { def foo() = println("C") }
class A extends B with C {
  override def foo() = super[B].foo()
}

If you want to make sure B declares foo, you can use type ascription:

class A extends B with C {
  (this:B).foo()
}

This will only compile if B declares foo (but it might be implemented in C or A).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.