2014-11-20 26 views
5

Czy istnieje możliwość niejawnego przekazania niektórych metod klasy do enkapsulowanego obiektu?Scala przekazuje dalej lub deleguje metody enkapsulacji obiektu

case class Entity(id: Int, name: String,) { 
    private lazy val lastScan = new LastScan 

    def getLastScanDate = lastScan.getLastScanDate 
    def updateLastScanDate = lastScan.updateLastScanDate 
} 

Chcę uniknąć tworzenia def updateLastScanDate = lastScan.updateLastScanDate tylko po to, aby przekazywać metody do owiniętego obiektu.

Odpowiedz

1

W prostym języku nie jest to możliwe. W przeszłości istniała wtyczka do kompilacji autorstwa Kevina Wrighta, aby osiągnąć tę automatyczną delegację.

Wydaje się, że pracuje nad wersją Autorproxy "Rebooted" teraz opartą na makrach, dzięki czemu można ją łatwo umieścić w projekcie. Przyklejam tutaj przykład z jego źródeł testowych:

trait Bippy { 
    def bippy(i : Int): String 
} 

object SimpleBippy extends Bippy { 
    def bippy(i: Int) = i.toString 
} 

@delegating class RawParamWrapper(@proxy pivot: Bippy) 
val wrapper = new RawParamWrapper(SimpleBippy) 
assert(wrapper.bippy(42) == "42")