scala: nadpisanie metod przy wielokrotnym dziedziczeniu

0
class FileRepository {
    def read: String = {
        // ...
    }
}
class AbstractRepository[A] {
    def read: A = {
        // ...
    }
}
class SpecificRepository extends FileRepository with AbstractRepository[MyDto] {

    override def read: MyDto = {
        // ...
    }

}

Czy da się jakoś wskazać, której klasy metodę nadpisuję?
Bo na stacku piszą, że np. super.read się nie da.

0

To się kompiluje w ogóle? Nie powinno, bo rozszerzasz naraz dwie niepowiązane klasy wprost.

Bo na stacku piszą, że np. super.read się nie da.

Pewnie coś nadinterpretujesz. Używałem (co prawda baaaardzo rzadko, ale jednak) super.metoda w Scali i działa.

0

Jeśli sygnatury metod read były by zgodne następuje coś takiego jak Traits linearization, co może posłużyć do budowy statycznego dekoratora. W twoim wypadku jednak sygnatury metod są różne ze względu na typ zwracany i myślę że wywali się to podczas kompilacji

Jak pisze @Wibowit to się nie skompiluje bo wielodziedziczenie z wielu klas w Scali jest zabronione. Spróbuj użyć traitów

0

No właśnie mi się nie kompiluje i pytam jak zrobić... Ech, myślałem, że można wielodziedziczyć w scali...
z tym super to tez mi chodziło o użycie super jak masz wielodziedziczenie.

a jak będę miał tak:

class FileRepository {
    def read: String = {
        // ...
    }
}
trait AbstractRepository[A] {
    def read: A
}
class SpecificRepository extends FileRepository with AbstractRepository[MyDto] {

    override def read: MyDto = {
        // ...
    }

}

to jak wskazać mu którą metodę chcę nadpisać?

1

Jak wywołam read na twoim SpecificPotworze to mam dostać String czy MyDto?

0

Nie wskażesz.

  • Po pierwsze, nie możesz mieć dwóch metod różniących się tylko typem zwracanym
  • Po drugie, nawet jakby typ był ten sam to w Scali jest linearyzacja takich metod. Zobacz Traits linearization
0
jarekr000000 napisał(a):

Jak wywołam read na twoim SpecificPotworze to mam dostać String czy MyDto?

MyDto, no masz:

    override def read: MyDto = {
        // ...
    }
1

W takim razie na kiego grzyba jest to extends FileRepository (z metodą read:String)?

0
Julian_ napisał(a):
jarekr000000 napisał(a):

Jak wywołam read na twoim SpecificPotworze to mam dostać String czy MyDto?

MyDto, no masz:

    override def read: MyDto = {
        // ...
    }

Wywołuję val value = specificRepository.read. Co dostanę? Jakiego typu jest zmienna value?

0
jarekr000000 napisał(a):

W takim razie na kiego grzyba jest to extends FileRepository (z metodą read:String)?

bo w FileRepository mam silnik

abstract class FileRepository(filePathIn: String, filePathOut: String, encoding: String) {

  val logger: Logger = Logger(LoggerFactory.getLogger(this.getClass))

  protected def this(filePathIn: String, filePathOut: String) {
    this(filePathIn, filePathOut, "utf-8")
  }

  protected def find: Option[Seq[String]] = {
    val requests = using(Source.fromFile(filePathIn, encoding)) {
      source => Try(source.getLines().toList).get
    }
    Option(requests)
  }

  protected def save(lines: Seq[String]) {
    logger.debug("Appedning: " + lines.length + " lines to " + filePathOut)
    val str = lines.mkString("\n")
    File(filePathOut).appendAll(str)
    logger.debug("Appended.")
  }

  /**
   * the method copied from https://stackoverflow.com/a/40464999/13492634
   */
  private def using[A <: {def close(): Unit}, B](param: A)(f: A => B): B = {
    try f(param) finally param.close()
  }

}
class TagsFileRepository() extends FileRepository("src/main/resources/in/count-tag-indeed.txt", "") with Repository[Seq[TagsRowDto]] {

  override def find: Option[Seq[TagsRowDto]] = {
    val tags = super.find.get.map(TagsRowDto(1, _))
    Option(tags)
  }

}
KamilAdam napisał(a):
Julian_ napisał(a):
jarekr000000 napisał(a):

Jak wywołam read na twoim SpecificPotworze to mam dostać String czy MyDto?

MyDto, no masz:

    override def read: MyDto = {
        // ...
    }

Wywołuję val value = specificRepository.read. Co dostanę? Jakiego typu jest zmienna value?

MyDto

0
Julian_ napisał(a):
KamilAdam napisał(a):

Wywołuję val value = specificRepository.read. Co dostanę? Jakiego typu jest zmienna value?

MyDto

To po jakiego grzyba Ci

class FileRepository {
    def read: String = {
        // ...
    }
}

? Nie możesz nazwać tego jakoś inaczej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1