суббота, 19 марта 2011 г.

Урок 15. Get и set, override или Оптимизация.


Здравствуйте! Бывают такие случаи, когда нужно при изменении или чтении переменной выполнять какие-либо действия. Ну, например, у меня есть переменная – тик таймера. Когда я изменяю значение это переменной мне нужно изменить и delay таймера. Каждый раз после изменения переменной прописывать изменение delay таймера не хорошо. Что же делать? - Для этого есть специальная фича:



private var timerDelay:Number = 100;
private function set TimerDealy(value:Number){
timerDelay=value;
//здесь я уже могу прописать и изменение delay таймера
}
private function get TimerDealy(){
return timerDelay;
}
TimerDealy=500;//будет вызываться функция set TimerDealy
trace(TimerDealy);// будет вызываться функция get TimerDealy, выведет 500

Тут я думаю всё понятно. Так что переходим к override :)
Но для начала нам нужно понять, что такое наследование классов.
Допустим у нас есть класс A:

package{
import flash.display.Sprite;
public class A extends Sprite{
public var foo:Number=20;
public function A(){

}
public function traceFoo(){
trace(foo);
}
}
}

A extends Sprite – это и есть наследование. То есть у класса A будут доступны функции и переменные класса Sprite (x, y, z …). Мы сделаем то же самое, просто мы будем наследовать свой класс, чтобы было понятней.
Теперь напишем класс B, который будет наследовать класс A:

package{
public class B extends A{
public function B(){

}
}
}

Сразу видно, что в конструкторе ничего нет, но я говорил, что у наследника будут доступны функции предка. Проверим. Для этого напишем класс Main, который будет создавать экземпляры класса A и B и вызывать у них функцию traceFoo:

package  {
import flash.display.Sprite;
public class Main extends Sprite{
public function Main() {
var a:A=new A();
var b:B=new B();

a.traceFoo();
b.traceFoo();
}
}
}

Должно работать. А где же это может иметь практическое применение? – например, когда вам нужно создать кучу разных врагов, у них всех будет какая-то своя фича, но все они будут двигаться, стрелять, у каждого из них будет броня и жизни. Для этого как раз можно создать класс, у которого будут функции ходьбы, стрельбы, переменные жизни и брони. А потом просто наследовать этот класс.
Теперь переходим к override. Что это такое и для чего это нужно? Сразу объясню на прошлом примере. Допустим, у нас есть враг, который не будет стрелять, а будет ходить с мечом и бить, кого видит. Но отдельно для него вызывать функцию атаки мечом глупо. Для решения этой проблемы нам и понадобится override. Override просто переназначает функцию. Изменим немного наши классы, в классе A изменяем функцию traceFoo:

virtual public function traceFoo(){
trace(foo);
}

Просто добавили слово virtual. Теперь в классе B дописываем функцию traceFoo:

override public function traceFoo(){
trace("у функций одинаковое название, но они выполняют разные действия");
}

Класс Main не трогаем, запускаем. Выведет в output :
20
у функций одинаковое название, но они выполняют разные действия
Ну, собственно и всё. Если не получилось – качайте пример. Удачи!)

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

Отправить комментарий