Как правильно называть конструктор суперкласса в Scala? - PullRequest
2 голосов
/ 19 ноября 2010

Предположим, я хотел бы расширить класс C, получив SubC.

Теперь я хотел бы получить доступ к переменной c в SubC, как показано в примере ниже в методе printC.

Следующее не работает, так как вызов printC для экземпляра SubC выведет SubC c, а не C c (я думаю, я мог бы выбрать лучшие имена ..)

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

class SubC(c: Int) extends C(c) {
  def printC : Unit = {
    println(c)
  }
}

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 1
  }
}

Возможное (но нежелательное) решение:

class SubC(cc: Int) extends C(cc) {
  def printC = {
    println(c)
  }
}

Это работает, но вводит новый (и ненужный) идентификатор cc в область действия.

Есть ли лучший (более чистый) способ сделать это?

PS: поместить приведенный выше пример в некоторый контекст. Что я на самом деле хочу сделать, так это дополнить C некоторыми чертами, не вводя новые идентификаторы в область действия.

Ответы [ 2 ]

9 голосов
/ 19 ноября 2010

Это, вероятно, лучший способ дополнить C чертами, не вводя новые идентификаторы в область действия:

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

trait CanPrintC {
  self: C =>
  def printC : Unit = {
      println(c)
  }
}
class SubC(c: Int) extends C(c) with CanPrintC 

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 3
  }
}
2 голосов
/ 19 ноября 2010

Используйте свои типы:

class SubC(c: Int) extends C(c) {  
  self: C =>
  def printC : Unit = {            
    println(self.c)              
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...