Mam dwie klasy przypadków, które dziedziczą po abstrakcyjnej klasie bazowej. Chcę zdefiniować niektóre metody na abstrakcyjnej klasie bazowej, które używają metod kopiowania na dziedziczących klasach przypadków (i tak zwróć instancję klasy potomnej). Czy istnieje sposób, aby to zrobić przy użyciu typów własnych?Scala: Czy istnieje sposób, aby klasa nadrzędna miała dostęp do metod zdefiniowanych tylko przez dzieci?
Przykładowy kod:
abstract class BaseClass(a: String, b: Int) {
this: case class => //not legal, but I'm looking for something similar
def doubleB(newB: Int) = this.copy(b = b * 2) //doesn't work because BaseClass has no copy
}
case class HasC(a: String, b: Int, c: Boolean) extends BaseClass(a, b) {
def doesStuffWithC(newC: Boolean) = {
...
}
}
case class HasD(a: String, b: Int, D: Double) extends BaseClass(a, b) {
def doesStuffWithD(newD: Double) = {
...
}
}
Mam zorientowali się, jak uzyskać wynik chcę podziękować tym pytanie: How to use Scala's this typing, abstract types, etc. to implement a Self type? ale polega na dodaniu metodę makeCopy do klasy bazowej i przesłanianie go wywołaniu Kopiuj w każdej z klas przypadków podrzędnych, a składnia (szczególnie w przypadku typu Self) jest dość myląca. Czy istnieje sposób, aby to zrobić z wbudowanym Scala?
Ktoś odpowiedział, że wszystkie klasy sprawy rozszerzają 'Produkt', który jest prawdziwy, ale został usunięty, prawdopodobnie dlatego, że' kopia' nie jest zdefiniowany w 'Produkcie', więc nie działa, aby użyć go dla typu własnego. Dokument "Produkt" mówi "wszystkie klasy przypadków implementują Produkt z syntetycznie generowanymi metodami" - czy to oznacza, że nie mam szczęścia? –