Присвоение/изменение и получение значений свойств класса с помощью методов getter и setter
На этом занятии мы рассмотрим 2 вопроса:
- Присвоение/изменение и получение значений свойств класса с помощью методов getter и setter
- Дополнительная информация
Программисты, работающие с языком 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); // а так мы извлекаем значение