scala: создание абстрактных классов? - PullRequest
8 голосов
/ 19 марта 2012

Как получается, что я создаю экземпляр абстрактного класса?

  abstract class A {
    val a: Int
  }

  val a = new A {val a = 3}

Или какой-то конкретный класс неявно создан? И что означают эти скобки после new A?

Ответы [ 4 ]

19 голосов
/ 19 марта 2012

При этом вы неявно расширяете A.То, что вы сделали, это синтаксический сахар, эквивалентный следующему:

class A' extends A {
    val a = 3
}
val a = new A'

Эти скобки просто позволяют расширять класс на лету, создавая новый анонимный класс, который создает значение a и поэтому неабстрактные больше.

5 голосов
/ 19 марта 2012

Если вы знаете Java, это похоже на:

new SomeAbstractClass() {
    // possible necessary implementation
}

Из-за единого доступа Scalas похоже, что вы не реализуете какие-либо абстрактные функции, но просто давая значение a, вы фактически "конкретизируете" класс.

Другими словами, вы создаете экземпляр конкретного подкласса A без присвоения имени подклассу (таким образом, термин "анонимный" класс).

3 голосов
/ 19 марта 2012

вы создаете экземпляр анонимного класса, который наследует от A и перегружает его абстрактный член.Для справки см. Часть об экземплярах анонимных классов в Путешествие по Scala: Абстрактные типы

3 голосов
/ 19 марта 2012

Scala позволяет создавать не только анонимные функции, но и анонимные классы.

То, что вы сделали, имитирует

class Anon extends A {
  val a = 3
} 

, но без Anon name

...