Implicit method that is matched by trait that's extended by a specific (case?) class

72 Views Asked by At

I have case classes BFile and AFile that both extend trait File. And case classes BDir and ADir that both extend trait Dir. The classes are instantiated as their trait type.

I am trying to write implicit move methods (located on an object outside the A/BFile and A/BDir classes) that are overloaded for each combination of A/BFile & A/BDir.

I am unsure how to do this such that a different .move method will be implicitly used based on the specific classes of File and Directory. Is this even possible?

The reason why I don't want these methods implemented inside the class is because it requires me to pull in additional dependencies to use the classes; and I am unable to always provide these dependencies.

I also don't want to settle for depending on only the class since I am trying to follow the dependency inversion principle.

Edit: I think I am looking for the following or some equivalent:

trait File {
  ...
  def move(directory: the class implementing this that extends Dir): File
  def copy(directory: the class implementing this that extends Dir): File
}

trait Dir {
  ...
}
0

There are 0 best solutions below