2012-05-15 1 views
1

Я изучаю Scala, и я исхожу из C++ (очень мало опыта Java). Там, где я работаю, мы часто используем следующую схему:Вложенные классы C++ в Scala

class SomeClass { 
public: 
    class Options { 
    ... 
    }; 
    SomeClass(const Options& options); 
    ... 
}; 

int main() { 
    SomeClass::Options options; 
    options.a = ...; 
    ... 
    SomeClass* sc = new SomeClass(options); 
} 

Как эмулировать это в Scala?

ответ

5

Это своего рода эквивалент:

object SomeClass { 
    case class Options(option1: String, option2: Boolean) 
} 

class SomeClass(options: Options) { 

    //this is constructor! 
    println(options.option1) 

} 

object Main extends App { 
    val options = SomeClass.Options("One", false) 
    //or even: SomeClass.Options(option1 = "One", option2 = false) 
    val sc = new SomeClass(options) 
} 

Подробнее о вложенных классов (не путать с внутренними классами в Java): Static inner classes in scala.

Комментарии:

  • Options вложен SomceClassобъекта, не class
  • Options может быть case class - таким образом, вы получите неизменность и аксессоров для свободного
  • В Scala у вас есть один первичный конструктор, определенный очень кратким образом.
  • Разное: Scala использует по умолчанию ссылку по умолчанию и все var iables - фактически указатели (меньше дополнительных символов по сравнению с C++).
+0

Если есть много вариантов, вы можете даже использовать именованные параметры, чтобы сделать его более понятным. – aioobe

+0

@aioobe: спасибо, добавил его к моему ответу –

+0

Хм, выглядит немного хак-иш. Предположим, у меня есть класс (SomeClass) и куча связанных вспомогательных классов, которые имеют смысл только в контексте 'SomeClass' (например,' Options' в моем примере). В C++ я мог бы вложить все связанные вспомогательные классы или ввести что-то вроде пространства 'detail' /' internal'. Каков предпочтительный способ сделать это в Scala? Обратите внимание, что отношение между некоторыми классами и классом, а не экземпляр этого класса, поэтому я не требую/хочу зависимых типов здесь. – Jasiu

 Смежные вопросы

  • Нет связанных вопросов^_^