Ограничение Scala на атрибуты, определенные конструктором - PullRequest
1 голос
/ 07 марта 2012

В Scala можно определять атрибуты класса в конструкторе.Но как только вы объявляете их там, уже невозможно изменить поведение (методы получения и установки), как вы можете делать это при объявлении в теле класса?

Пример:

class MyExample(var attribute : String)
{
    def attribute() //trying to override getter <- doesn't work
}

class MyExample(theAttribute : String)
{
   def attribute = theAttribute //overriding default accessor (was var)
}

Если этоне возможно, почему так?Может показаться странным, когда вы показываете людям, что они могут легко создавать атрибуты, устанавливая var или val в конструкторе, и не заботятся о методах получения и установки (они могут измениться, если они нуждаются), чтобы в конечном итоге обнаружить, что на самом деле вам следует избегать их использования.вид облегчений.

1 Ответ

7 голосов
/ 07 марта 2012

Давайте на минутку представим, что было возможно переопределить сгенерированный метод доступа:

class MyExample(var attribute : String)
{
    def attribute() = attribute + "abc" // won't compile!
}

Без дальнейшей квалификации невозможно определить, находится ли имя attribute в теле методаотносится к полю класса или рекурсивно к самому методу.

По замыслу в Scala методы и поля принадлежат одному и тому же пространству имен, это, известное как Принцип унифицированного доступа , даетвозможность изменения внутренней реализации без нарушения внешнего интерфейса.

Первоначальная реализация может быть:

class MyExample(val attribute : String)

Затем изменена на:

class MyExample (attr :String) {
   def attribute = attr toUpperCase 
}

И затем

class MyExample(var attribute : String)

Или

class MyExample(attr : String) { 
    def attribute = attr toUpperCase 
    def attribute_= (a : String) { attr = a + "abc" } 
}

Все без нарушения какого-либо зависимого кода.

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

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