2016-12-14 4 views
3

У меня есть родительский абстрактный класс P:Scala матч подклассу с параметром

abstract class P { 
    def isEmpty: Boolean 
} 

Тогда у меня есть 2 подклассы Empty и NonEmpty:

class Empty extends P { 
    def isEmpty: Boolean = true 
} 

В NonEmpty, мне нужно определить функцию union, как следует:

class NonEmpty(name: String) extends P { 
    def isEmpty: Boolean = false 
    def union(that: P): Unit = { 
    that match { 
     case e: Empty => print("empty") 
     case n: NonEmpty => print("NonEmpty:" + n.name) 
    } 
    } 
} 

Однако у меня была ошибка:

14: error: value name is not a member of NonEmpty 
    case n: NonEmpty => println("NonEmpty:" + n.name) 
               ^

Почему?

ответ

4

Просто введите name общественное (то есть видимое) значение члена класса.

class NonEmpty(val name: String) extends P { ... 

Или вы можете превратить его в case class. При этом параметр становится общедоступным автоматически, а шаблон соответствует немного более чистому и кратким.

case NonEmpty(n) => print("NonEmpty:" + n) 
+1

'typeOf [NonEmpty] .member (TermName (« name »)). IsPrivateThis' is true, поэтому он уже является членом значения, как указано в другом ответе. Захваченное поле - это не просто артефакт. –

+1

Ack! Терминология меня трогает _again_. – jwvh

+0

Кроме того, его членство никоим образом не зависит от того, «поле было испущено в байтовом коде». Я просто устал и смутился. –

2

name является аргументом для конструктора класса, но поле не было присвоено это значение для объектов NonEmpty класса.

Заменить
class NonEmpty(name: String) extends P
с
class NonEmpty(val name: String) extends P

Выполнение этого определяет поле и присваивает значение, переданное в конструктор.

Кажется, что вы используете эти классы для моделирования дерева как структуры данных. В этом случае было бы целесообразно определить Empty как объект вместо класса.

+1

Поле действительно существует, оно просто личное. –

+0

@AlexeyRomanov 'private [это]'. Я должен был проверить, что вы действительно можете найти его, и да, вы можете. Спасибо. –