Присвоение/изменение и получение значений свойств класса с помощью методов getter и setter

На этом занятии мы рассмотрим 2 вопроса:

  1. Присвоение/изменение и получение значений свойств класса с помощью методов getter и setter
  2. Дополнительная информация

Программисты, работающие с языком Java знают и практикуют очень полезный способ работы со свойствами классов.

Создаются две специальные функции, так называемые getter и setter (геттер и сеттер), пользоваться которыми очень удобно в ситуациях, когда нужно ПРИСВОИТЬ (если ещё не присвоено!) или ИЗМЕНИТЬ значение свойства (Вы делаете это один раз и не нужно беспокоиться обо всех упоминаниях этого свойства в коде!) или ПОЛУЧИТЬ значение (value) свойства. В итоге работа с кодом становится легче и удобнее.

Ещё раз: getter и setter могут управлять свойствами классов из ЛЮБОГО места кода Вашего проекта, т.е. из другого класса того же пакета, из любого класса другого пакета и т.д. Это очень практично и эффективно.

Для того чтобы это реализовать нужно сделать следующее:

  • изменить модификатор доступа свойства с public на private;
  • написать метод (setter) для этого свойства с именем setProperty, где Property – имя свойства.  Этот метод будет принимать в качестве аргумента новое значение, которое присваивает свойству 
  • для ПОЛУЧЕНИЯ значения свойства нужно создать метод getProperty, который будет возвращать значение свойства.

Например, для изменения имени файла в нашей галерее (см. урок «Использование класса ActionScript 3») нужно написать следующий код:

public function setFileName(fileName:String):String
{
   this.fileName = fileName; 
}

Заметьте, что не смотря на то, что свойства записаны как private, методы должны быть public! Это обеспечивает доступ к ним из любого места Вашего кода.

Чтобы создать геттер (метод, возвращающий значение свойства) делаем следующее:

public function getFileName():String
{
   return this.fileName; 
}

Мы только что обсудили создание и работу так называемых явных сеттеров и геттеров. Я рассказал о них с одной целью — показать, что большинство объектно-ориентированных языков программирования предлагают именно такую возможность.

Создание геттеров и сеттеров в AS 3 осуществляется с помощью ключевых слов set и get. Это дополнительные модификаторы, которые записываются при декларации методов и делают их неявными геттерами и сеттерами.

Давайте разберем это более подробно.

Присвоение/изменение и получение значений свойств класса с помощью неявных сеттеров и геттеров в AS3

Откройте класс, уже содержащий свойства (см. уроки «Создание нового файла ActionScript» и «Класс ActionScript. Создание основной структуры»).

Измените модификатор доступа к свойству с public на private.

Ниже блока со свойствами запишите setter для первого свойства. Например:

public function set PhotoName(newName:String):String
{
   photoName = newName;
}

Заметьте, что эта запись очень близка к той, что мы разбирали в первой части этого урока, с той лишь разницей, что ключевое слово set записывается отдельно между словом function и именем функции PhotoName. Это небольшое отличие, однако, создает большую разницу. Это ключевое слово превращает метод в неявный сеттер, способный присваивать/изменять значение свойства.

Повторите те же шаги для присвоения значений другим свойствам класса.

Теперь запишите getter, который будет возвращать значение первого свойства класса

public function get PhotoName():String
{
   returm photoName;
}

Как видите это очень похоже на создание сеттера выше, только вместо ключевого слова set мы записали get и никаких параметров функции PhotoName не передавали.

Проделайте то же самое для остальных свойств класса.

Сохраните файл File –> Save.

Теперь можно использовать созданные getter'ы и setter'ы для присвоения/изменения и получения значений свойств.

Дополнительная информация

Использовать getter и setter нужно следующим образом. Покажем это на примере класса Picture.

ДО создания setter'а обращение к свойству photoName было бы таким:

myPhoto1.photoName = "Моё первое фото";

ПОСЛЕ создания setter'а изменяем значение свойства уже так:

myPhoto1.PhotoName = "Моё первое фото";

Для тех кто не заметил разницу: в имени свойства класса photoName первая буква — маленькая «p», в имени функции PhotoName (сеттера) — большая «P».

Для получения значения свойства действуем аналогично.

ДО, т.е традиционный способ получения значения свойства:

private var firstPhotoName = myPhoto1.photoName;

ПОСЛЕ создания метода PhotoName с модификатором get:

private var firstPhotoName = myPhoto1.PhotoName;

Еще один пример создания и использования сеттера и геттера (спасибо Colt):

class Car {
  private var _fuel:int; // топливо
  public function Car() {
    // todo: конструктор
  }
  public function get fuel():int {
    return _fuel;
  }
  public function set fuel(new_fuel:int):void {
    this._fuel = new_fuel;
    if (this._fuel < 0) {
      this._fuel = 0;
    } else if (this._fuel > 500) {
      this._fuel = 500;
    }
  }
}

var p1_car:Car = new Car();
p1_car.fuel = 440; // тут мы присваиваем новое значение
p1_car.fuel += 130; // можем вот так элегантно изменить 
                    // его значение, сеттер сделает всю 
                    // работу по проверке за нас
trace(p1_car.fuel); // а так мы извлекаем значение