Здавалка
Главная | Обратная связь

Переопределение функций



"Переопределение функции" - это изменение реализации функции базового класса для производного класса. Например, вы пишете сценарий для нового вида монстра называемого Demon. Создаваемый вами класс Demon наследует класса Pawn. Когда Pawn видит игрока в первый раз, вызывается функция "SeePlayer" класса Pawn, и Pawn может начать атаковать игрока. Это хорошая концепция, но говорят, что вам хотелсь бы изменить функцию "SeePlayer" для вашего нового класса Demon. Как вы это делаете? Конечно же, с помощью переопределения функции SeePlayer.

Чтобы переопределить функцию, можно просто скопировать определение функции из базового класса и вставить в новый класс. Например, вы можете добавить функцию SeePlayer в ваш класс Demon.

// New Demon class version of the SeePlayer function.

function SeePlayer( actor SeenPlayer )

{

log( "The demon saw a player" );

// Add new custom functionality here...

}

Переопределение функций является ключом к более эффективному созданию новых классов UnrealScript. Вы можете создать новый класс, который расширяет существующий класс. В этом случае все, что вам нужно сделать, это переопределить функции, алгоритм которых должен отличаться от функций базового класса. Это позволяет создавать новые типы объектов без написания множества строк кода.

Некоторые функции в UnrealScript объявляются со спецификатором final. Ключевое слово final (находящееся непосредственно перед словом function) указывает, что данная функция не может быть переопределена для дочернего класса. Этот спецификатор должен быть использован в функциях, для которых переопределение нежелательно, потому что может привести потерям производительности. Например, у вас есть функция VectorSize, которая вычисляет размер вектора. В ней совершенно нечего переопределять, то есть ее целесообразно его объявить какfinal. С другой стороны, конкретная реализация функций, подобных Touch, сильно зависит от контекста и не должна быть окончательной.

===Расширенные спецификаторы функций

Static

Статическая функция языка UnrealScript подобна статической функции языка C++, ее можно вызывать без ссылки на объект класса. Статические функции могут вызывать другие статические функции, может получать доступ к значениям по умолчанию для переменных. Статические функции не могу вызвать не статические функции и получать доступ переменным экземпляра (так как они не выполняются по отношению к экземпляру объекта). В отличие от языка C++, статические функции являются виртуальными и могут быть переопределены в дочерних классах. Это полезно в тех случаях, когда вы хотите вызывать статическую функции для переменной класса, а на момент компиляции класс не известен, но представлен переменной со ссылкой на класс.

Singular

Ключевое слово singular предотвращает возможность рекурсивного вызова функции. Правило в следующем: если ссылка на актор уже в пределах сингулярной функции, то любые последующие вызовы сингулярной функции будут пропущены. В некоторых случаях это позволять бесконечной рекурсии. Например, если вы попытаетесь перемещать актор внутри вашей реализации функции Bump, то есть вероятность, что во время своего движения актор врежется в другой актор, в результате чего произойдет вызов Bump еще раз, и так далее. Для предотвращении подобного поведения Вы должны быть очень осторожны, но если у вас нет полной уверенности в невозможности появления бесконечной рекурсии, то используйте ключевое слово singular.

Native

Вы можете объявить функцию UnrealScript как native, то есть указать, что функция вызывается из UnrealScript, но реализована в коде на C++. Например, класс Actor содержит много определений функций со спецификатором native, например:

native(266) final function bool Move( vector Delta );

Число в скобках, после ключевого слова native соответствует номеру функции, объявленной в коде на C++ (с использованием макроопределения AUTOREGISTER_NATIVE), и необходимо только для оператор-функции. Встроенные функции, как ожидается, находятся в DLL с именем, идентичным имени пакета классов, содержащего определение на языке UnrealScript.

NoExport

Используется только для встроенных функций. Указывает, что объявление функции на C++ для этой встроенной функции не должно быть экспортировано. При компиляции сценария в автоматически генерируемый заголовочный файл будет помещено только объявление этой функции.

Exec

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

Latent

Указывает , что встроенная функция латентная, а это означает, что она может быть вызвана только из кода состояния и может вернуть значение через некоторое количество игрового времени.

Iterator

Указывает, что встроенная функция является итератором, который может быть использован для перебора списка акторов с помощью команды foreach.

Simulated

Указывает, что функция может выполняться на стороне клиента, когда актор эмулируется прокси или автономным прокси. Все встроенные функции как правило эмулируются автоматически. (Примечание: если вы переопределите виртуальную встроенную функцию функцией сценария, функция сценария НЕ будет эмулироваться, если вы укажете это ключевое слово)

Server

Указывает, что функция должна быть отправлена на сервер, а не выполняться на локальном клиенте.

Client

Указывает, что функция должны быть направлена для выполнения на клиенте-владельце, а не запускается на сервере. Этот флаг также неявно устанавливает для функции флаг simulated.

Reliable

Указывает, что реплицируемая функция (отмеченая флагом server или client) должна быть надежно передана, то есть должна гарантированно достичь адресата.

Unreliable

Указывает, что реплицируемая функция (отмеченая флагом server или client) должна быть отправлена ненадежно, что означает, что ее достижение адресата не гарантированно, ее передача может быть выполнена в любой удобный момент не выполняться вообще, если не позволяет пропускная способность сети.

Private, Protected

Эти спецификаторы имеют тот же смысл, что и соответствующие ключевые слова для переменных.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.