Просмотр полной версии : Переопределение операторов в AS3
Только начал разбираться с третим скриптом. Вижу что много нового полезного добавили. А переопределение операторов добавили?
А что подразумевается под «переопределение операторов»?
если вы имеет ввиду переопределение членов класс, то это можно делать и во второй версии языка...
Если кто программировал на C++, то помнят , что там можно переопределить такие операторы как +,-,=,==,[] и т.д.
Например для класса Vector3D очень бы хотелось писать так
var a:Vector3D = new Vector3D(1,0,0);
var b:Vector3D = new Vector3D(0,1,0);
b += a; // b(1,1,0) - теперь
а не так
var a:Vector3D = new Vector3D(1,0,0);
var b:Vector3D = new Vector3D(0,1,0);
b = b.Sum(a); // b(1,1,0) - теперь
Кстати вопрос в догонку, как управлять оператором =
То есть как я могу указать я хочу ссылку на объект скопировать или просто скопировать все члены объекта? В AS2 мне приходилось писать функцию CreateCopy, которая создавала новый объект такого же класса, копировала все члены и возвращала ссылку.
Ненужно этого делать, ибо плохой стиль программирования, если работаешь в комманде - неочевиден результат для напарника, хотя если работаешь сам с собой то все нормально.
Кстати вопрос в догонку, как управлять оператором =
Никак.
Ненужно этого делать, ибо плохой стиль программирования, если работаешь в комманде - неочевиден результат для напарника, хотя если работаешь сам с собой то все нормально.
Не нужно чего делать? Это про какой пункт?
Если про операторы += и тому подобные, то как же Вы порекомендуете поступать с векторами и матрицами?
Как раз для таких типов подобные оперторы это хороший стиль программирования, т.к. операции суммы, вычитания, скалярного умножения или веторного умножения вполне определённые вещи.
Кстати, может есть встроенные 2D или 3D вектора ?
2Ляксей
потому что ECMA,
а по поводу хорошего стиля, согласен, нехрен повторять умные слова из заумных книжек.
а просто методами нельзя подобное сделать? приведи пример?
и еще бы посоветовал порыть сырцы какой нибудь 3D либы типа Papervision и физического движка на AS3.
2Ляксей
потому что ECMA,
а по поводу хорошего стиля, согласен, нехрен повторять умные слова из заумных книжек.
Согласен с кем? Причём тут заумные книжки, речь идет об удобстве программирования, читабельности кода и прочих вещах повышающих
производительность труда.
а просто методами нельзя подобное сделать? приведи пример?
Можно и просто методами. Код внутри опертора * и метода mult будет практически один и тот же.
Только первый вариант более читабельный.
c = b*a; // вариант 1
c = b.mult(a); // вариант 2
Вы вот попытайтесь написать что-нить интенсивно использующее математику типа 3D движка на Flash или сложный движок частичек( со всякими физ силами и прочей красотой), тогда удобство/неудобство описанных концепций Вам станет более очевидным.
мне и так все очевидно,
кратко - да,
возможности которые нельзя сделать методами - нет.
я хотел увидеть пример реализации который действительно нельзя реализовать с помощью методов...
а согласен я был с вами.
Вы вот попытайтесь написать что-нить интенсивно использующее математику типа 3D движка на Flash или сложный движок частичек( со всякими физ силами и прочей красотой), тогда удобство/неудобство описанных концепций Вам станет более очевидным.
Каюсь 3д движки не писал, но пересмотрел несколько, и чествно говоря ну уж прям необходимости в перегрузке операторов не увидел.
если уж браться за математику, может лучше написать какой транслятор с языка куда более для математики подходящий?
а с перегрузкой, опять же у меня чисто академический интерес. зачем перегрузка нужна то? на Cи как то не пришлось пописать, ну взять "современные" языки типа С# или Scala ... ну да приятный синтаксический сахар, ну меньше писать, но и путаницы больше, поди разбери кто этот оператор перегрузил. с методом на самом деле ведь проще и документируется проще. передать можно больше параметров чем один.... а что меньше писать.. может быстрее нужно набирать текст?
короче перегрузки нет, и все тут :)
По поводу 3Д движков, я их тоже не писал, но...
Не стоит рассчитывать большие объёмы математики множеством инкапсулированых методов... сильно снизится производительность.
Ну например я сделал класс комплексного числа, где создал методы умножения и деления. Так вот, умножение комплексных чисел инкапсулирвоанными методами(или перегруженными операторами исли бы такие были в AS3) в десятки раз медленне прямого умножения и назначения переменных. (без геттеров/сеттеров, что тоже важно)
WindWalker
19.07.2007, 11:25
В HaXe есть такой оператор: ... (троеточие).
Создаёт итератор от первого до второго операнда.
Например:
for (var i in 0...str.length) {}
Разумеется, можно сделать и методом. Но как оператор выглядит более красиво и понятно.
Тоже, кстати, давно мечтаю о переопределнии операторов в AS, но, увы, видимо этого никогда не будет.
P.S.
А ещё я слышал страшную историю про переопределённый оператор "запятая" :)
WindWalker
19.07.2007, 11:27
Так вот, умножение комплексных чисел инкапсулирвоанными методами(или перегруженными операторами исли бы такие были в AS3) в десятки раз медленне прямого умножения и назначения переменных. (без геттеров/сеттеров, что тоже важно)
Поэтому хочется иметь ещё и inline-методы :)
BlooDHounD
19.07.2007, 11:36
вот inline методы - это то чего реально не хватает.
versus_spb
14.07.2009, 02:55
А на вопрос так никто и не ответил. Как всегда...
Так можно ли сделать переопределение операторов (например, "+") в AS3?
dmitriev
14.07.2009, 03:41
versus_spb, я почему-то увидел ответ на вопрос.
короче перегрузки нет, и все тут
terbooter
14.07.2009, 08:48
BlooDHounD, что такое inline методы?
Вы имеете ввиду анонимные функции?
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function() {
trace("Security error occured");
});
inline - когда вместо вызова функции компилятор подставляет её код. Это убирает накладные расходы на вызов функции в обмен на увеличение объёма исполняемого файла.
DeliMIter
14.07.2009, 08:58
Нет. Т.н. inline методы это хитрый финт ушами, который есть, скажем, в haXe, и которого нету в AS3. Вызов метода, объявленного как inline, компилируется не как вызов метода, а подстановкой кода метода в вызывающий код. Таким образом, с одной стороны получается экономия на вызовах метода (не знаю, насколько это актуально в AS3, но вот в AS2 - да, это было актуально), а с другой, если этот метод вызывается из нескольких мест, нету необходимости вносить изменения во все эти места, если требуется что-то поменять.
P.S. И да, вот Стенко правильно отметил, т.к. код такого метода вставляется в вызывающий код, то вес результата увеличивается. И опять же, если не идёт борьба за каждый байт - не уверен, насколько эта проблема актуальна.
var a:uint = 1E7;
var start:uint = getTimer();
while (a--) Math.random();
trace(getTimer() - start); // 1874 ms
start = getTimer();
a = 1E7;
while (a--) getRandom();
trace(getTimer() - start); // 2914 ms
function getRandom():Number {return Math.random();}
В этом примере inline быстее наполовину.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.