PDA

Просмотр полной версии : Атрибут virtual


taluks
20.03.2013, 17:23
Какое значение несет атрибут virtual?
встретил в Бокс2Д
public virtual function SayGoodbyeJoint(joint:b2Joint) : void{};

in4core
20.03.2013, 19:07
Интересно . Ни разу не встречал и по-моему в справке нету такого, смотрели?

strangedk
20.03.2013, 19:14
Встречал в коде native и virtual, тоже не знаю откуда, не углублялся.
Вообще среда собирает это всё даже, и не ругается.

- Тоже интересно, откуда

Hauts
20.03.2013, 19:16
Ничего не делают такие модификаторы, они с расчетом на будущее, похоже, существуют.

AlexLucas
20.03.2013, 19:18
http://stackoverflow.com/questions/2248745/what-does-the-virtual-keyword-in-actionscript-does
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9b.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f6e
Собственно то что написал Hauts.

taluks
22.03.2013, 18:54
спасибо, будем ждать будущее)

i.o.
22.03.2013, 19:53
Встречал в коде native и virtual, тоже не знаю откуда, не углублялся.
Вообще среда собирает это всё даже, и не ругается.

- Тоже интересно, откуда
native - значит, что метод нативный, т.е. его реализация осуществлена в самом FlashPlayer'e. Используется для компиляции кода playerglobal.swc, например.

virtual - ну это из С++, означает, что метод может быть переопределен (override). В АС3, на данный момент, может использоваться как пометка, что данный метод можно/нужно переопределять в наследуемых классах.

cleptoman
22.03.2013, 20:40
virtual да, может быть переопределен как и protected, но, насколько я понял при модификаторе virtual при касте экземпляра к родительскому классу будет вызываться этот метод именно родительской реализации.
для "нужно переопределить" используется abstract.
но опять таки это не в АС3..тут они просто как указатели информационные для разработчиков что можно/нужно сделать с методом

caseyryan
22.03.2013, 21:36
virtual да, может быть переопределен как и protected, но, насколько я понял при модификаторе virtual при касте экземпляра к родительскому классу будет
Нет, в нем нет ничего особенного, это самое обычное переопределение, с атрибутом virtual или без него, разницы нет. Допустим в джаве, все методы, которые не помечены как final по умолчанию virtual. Они сразу доступны для переопределения, поэтому слово virtual писать не обязательно. Так же как абсолютно все методы интерфейсов по умолчанию public abstract соответственно компилятор сам это предположит, и разработчику нет нужды это дописывать.
опять же, в джаве опеределения методов в интерфейсах типа:

public abstract void setValue(int value);

и

void setValue(int value);

Абсолютно идентичны. То же и с атрибутом virtual

Какое значение несет атрибут virtual?
встретил в Бокс2Д
public virtual function SayGoodbyeJoint(joint:b2Joint) : void{};
Совершенно никакого. Это просто соответствие версии С++.
Можно написать просто
public function SayGoodbyeJoint(joint:b2Joint) : void{}
ничего от этого не изменится

Мне не понятно какое значение там несет точка с запятой после фигурных скобок )

maxkar
22.03.2013, 21:40
virtual да, может быть переопределен как и protected, но, насколько я понял при модификаторе virtual при касте экземпляра к родительскому классу будет вызываться этот метод именно родительской реализации.
Там, где был virtual (delphi/pascal, может быть C++) было как раз наоборот. Гарантировалось, что вызовется метод ребенка даже если compile-time тип выражения был типом родителя. В java/as/c#/javascript все методы по-умолчанию виртуальные, поэтому модификатор не требуется и не используется.

etc
22.03.2013, 23:10
Помнится, Блуд говорил, что virtual в будущем будет аттрибутом необходимости переопределения метода, а не то, что он доступен для этого.

caseyryan
22.03.2013, 23:26
Почему бы тогда не abstract?
Как-то не логично получится, по-моему.

Александр Мостовой
23.03.2013, 02:23
В АС3, на данный момент, может использоваться как пометка, что данный метод можно/нужно переопределять в наследуемых классах.

А я взял себе привычку от противного, всем методам кроме private (а их обычно очень мало) по умолчанию ставлю final, а те что планирую переопределить "помечаю" тем что не ставлю ничего

Psycho Tiger
23.03.2013, 10:02
А я взял себе привычку от противного, всем методам кроме private (а их обычно очень мало) по умолчанию ставлю final, а те что планирую переопределить "помечаю" тем что не ставлю ничего
Интересная привычка. Но это плохо при работе в команде: кто-нибудь захочет унаследоваться да чуточку подпилить поведение – а Вы ему палки в колеса. Это беда, если код скомпилен в swc, к примеру.

Я разруливаю ASDoc'ом. Аргументирую тем, что если человек хочет унаследоваться от моего класса – то хоть разок он в мой класс заглянет.

gloomyBrain
23.03.2013, 12:37
Интересная привычка. Но это плохо при работе в команде: кто-нибудь захочет унаследоваться да чуточку подпилить поведение – а Вы ему палки в колеса. Это беда, если код скомпилен в swc, к примеру.
На мой взгляд это нормально работает. Длинные цепочки наследования всегда сложнее отлаживать, чем композицию.

caseyryan
23.03.2013, 15:36
Длинные цепочки наследования всегда сложнее отлаживать, чем композицию
Каким образом при использовании композиции можно "чуточку подпилить поведение"?
Не вижу никакой практической пользы в том, чтобы везде писать final. Это реально палки в колеса. Зачастую даже самому себе

iflamberg
23.03.2013, 17:12
Меня всегда прикалывала эта ООП-шность мозга. Куча программистов, которые пишут себе там private или final, а затем через неделю, оп: "ой, это свойство мне в наследнике нужно". Зачем себе двойной работы добавлять?

etc
23.03.2013, 19:47
Интересная привычка. Но это плохо при работе в команде: кто-нибудь захочет унаследоваться да чуточку подпилить поведение – а Вы ему палки в колеса. Это беда, если код скомпилен в swc, к примеру.

Я разруливаю ASDoc'ом. Аргументирую тем, что если человек хочет унаследоваться от моего класса – то хоть разок он в мой класс заглянет.

Это если речь о пабликах идёт. А вообще палки в колеса, это хорошо на самом деле.