Что не так со следующим наследованием / соединением в Scala? - PullRequest
2 голосов
/ 24 августа 2011

По сути, я хочу иметь возможность смешивать в реальном или исторической обработке в моем алгоритме. Следующее не компилируется.

// Event driven processing
class Event {

}

// Live events (as opposed to historical)
trait Live extends Event {

}

class Algorithm {

}

new Algorithm with Live 

Ответы [ 3 ]

7 голосов
/ 24 августа 2011

Объявляя trait Live extends Event, вы указываете, что Live может применяться только к подклассам Event.Позже вы пытаетесь применить его к Algorithm, который не является подклассом Event, поэтому компилятор жалуется.

В зависимости от вашего первоначального намерения (не ясно из этого фрагмента), вы можетехотите либо:

  • Объявить Event как саму черту;
  • У Algorithm расширить Event.
5 голосов
/ 24 августа 2011

Вы делаете наследование нескольких классов там. если черта Live распространяется Event, ваш тип Algorithm with Live имеет двух предков класса, Event и Algorithm. Это запрещено что вы хотите сделать, не ясно, но если возможно сделать Event чертой, а не классом, это должно сработать. trait Live extends Event подразумевает, что Live должен быть смешан с Event или подклассом. Так что, если Algorithm может расширить Event (маловероятно), это тоже сработает.

0 голосов
/ 24 августа 2011

Полный пример будет:

// Event driven processing. Must be a trait due to didierd's comment
// and Jean-Philippe's comment
trait Event

// Live events (as opposed to historical)
trait Live extends Event

// Self typing isn't strictly needed but generally it's not much use without it
// as I assume you're going to want to use methods of the Event within your
// Algorithm
class Algorithm { self: Event =>
}

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