Самый простой способ сделать это - неявное преобразование вместо расширения класса:
class Bridge { ... }
implicit def bridge2road(b: Bridge) = b.roadway
до тех пор, пока вы не нуждаетесь в оригинальном Bridge
, который нужно взять с собой в поездку (например, вы собираетесь хранить Bridge
в коллекции Road
).
Если вам нужно вернуть Bridge
снова, вы можете добавить owner
метод в Road
, который возвращает Any
, установить его с помощью параметра конструктора для BridgeCauseway
, а затем pattern- матч, чтобы получить свой мост:
trait Road {
def owner: Any
...
}
class BridgeCauseway(val owner: Bridge) extends Road { . . . }
class Bridge extends Road {
val roadway = new BridgeCauseway(this)
...
}
myBridgeCauseway.owner match {
case b: Bridge => // Do bridge-specific stuff
...
}