Scala дочерний класс наследует черты родительского класса? - PullRequest
1 голос
/ 21 января 2012

Почему, если у меня есть:

trait T {
  def method(a: Int)
}

class A extends T {
  //...
}

class B extends A {
  //...
}

тогда, когда я делаю это:

//...
val b = new B
b.method(15)
//...

говорят, что method() не определено для B? Почему я должен прямо сказать, что

class B extends A with T

чтобы получить то, что я хочу? Не наследуются ли черты родительских классов? Как это может быть так, если они могут реализовать большую часть собственных методов родителя, которые наследуются по определению? Если это так, то каков аргумент?

Ответы [ 2 ]

8 голосов
/ 21 января 2012

Я думаю, вы просто не реализовали метод method, потому что я протестировал его на своем компьютере и работает следующий код:

scala> trait T {
 | def method(a:Int) =a
 | }
defined trait T

scala> class A extends T
defined class A

scala> class B extends A
defined class B

scala> val b = new B
b: B = B@164a40a0

scala> b.method(11)
res25: Int = 11
5 голосов
/ 21 января 2012

Ваш код не компилируется, потому что метод никогда не реализуется. B не может быть создан, потому что все классы являются абстрактными.

Добавьте тело метода следующим образом в черту A:

def method(a: Int)={
    //do something useful here
}

Затем он компилируется, и ошибок нет, и действительно, экземпляр B может использовать метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...