2016-10-21 11 views
-2

я понять мой существующий проект, кое-что я не могу понять:Что означает «класс case extends trait» в Scala?

trait PeriodA { 
    def start: Long 
    def stop: Long 
    def description: String 
    def manageTo: String 
} 

case class PeriodEntity(
    start: Long, 
    stop: Long, 
    description: String, 
    manageTo: String) 
    extends PeriodA 

Не могли бы вы объяснить, что здесь происходит?

+1

У вас есть опыт работы на другом языке OO, например Java, C++, ...? –

+1

Возможный дубликат [Понимание класса и черт класса в Scala] (http://stackoverflow.com/questions/22769175/understanding-case-class-and-traits-in-scala) –

+1

Попробуйте выполнить поиск в stackoverflow для примеров с примерами классов простирающиеся черты. Есть много подробных ответов. –

ответ

4

Шаг за шагом:

  • trait PeriodA { - определение признака (что примерно интерфейс - для дальнейшего понимания ознакомьтесь, пожалуйста, spec)

  • def start: Long def stop: Long def description: String def manageTo: String - определение 'по вызову' оценивали свойства свойства. Вы можете рассматривать их как функции Java getFieldName.

  • case class PeriodEntity определение класса «случай», которое немного сложнее общего. В нескольких словах это определение делает компилятор неявным добавлением префикса val к каждому так называемому «элементу» (поле) определения. Он также определяет объект-компаньон с парами функций apply/unapply, который пригодится, если вы хотите использовать сопоставление шаблонов, но это не соответствует текущей теме. Case classes specification

  • start: Long, stop: Long, description: String, manageTo: String - определение обоих параметров конструктора и полей классов, которые называются «элементами». Поскольку компилятор неявно отмечает элементы с префиксом val, их следует считать неизменяемыми. Как уже упоминалось ранее, их можно рассматривать как получающих доступ.

  • extends PeriodA - заявляет, что класс PeriodEntity миксины (орудия) PeriodA интерфейс. Поскольку элементы класса case неявно рассматриваются как val в компиляторе, нет необходимости явно реализовывать или переопределять абстрактные методы PeriodA - компилятор будет рассматривать элементы как стандартные реализации для вас.
0

Спасибо за меня поняли, я хотел бы поделиться своим пониманием,

trait PreridA - это ничего, но интерфейс не имеют 4 метода GET.

case class PeriodEntity extends PeriodA - PeriodEntity должен иметь 4 метода получения, как указано в PeriodA. Если вы удалите любую запись в PeriodEntity, вы получите исключение компиляции. Простыми словами, это похоже на класс, реализующий интерфейс.

У меня есть решение для такого рода недоразумений. Для этого у вас должны быть базовые знания Java.

  1. Положите код, который вы не поняли, в отдельный новый класс Scala.
  2. Не делайте это компиляцией.
  3. Если необходимо, перестроить проект, то он создаст файлы .class в целевом объекте.
  4. Используйте любой декомпилятор jd-GUI или еще.
  5. Или, CD < ..> \ цель \-2.11 Скала \ Классы Run

    javap пакет.Employee

  6. Вы увидите код java на консоли.

1,2 шага необходимо, только если вы работаете в проектах реального времени, фактический код проекта включает в себя множество логики. Если вы чувствуете, что можете понять, тогда вы можете опустить 1 и 2 шага.

Итак, вы можете легко понять, что именно означает ваш код Scala.

Это выглядит большой процедурой, но это не займет много времени. И заставьте его понять себя, а не объяснить кому-то.