Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.07.2008, 10:44
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 391  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на AS3 я привел. Истинно объектно-ориентированным языком можно назвать тот язык, который позволяет на уровне языка реализовать три принципа ООП сразу вместе на парочке классов, а не по отдельности, причем, реализованных средствами самого языка, а не руками, как тут уже всю тему пытаются сделать.

В AS1 у вас этого не получится, подобную приватность не скрестить с наследованием, а полиморфизма в AS1 вообще нет ни в каком виде. AS1 вам позволяет думать в стиле ООП, но не дает вам средств работы с ним. Т. е. вы сами реализовываете наследование (ручками), сами реализовываете приватность (либо на уровне договоренности с самим собой, что некоторые методы извне вызывать нельзя), а полиморфизм держите в голове. А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.
Кстати, наследование реализуется не так, как вы написали, это вообще будет ручной труд по копированию методов от предка к наследнику. Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__.

riden, то, что у вас каша в голове, созданная товарищем Гурским, наглядно показывает перепутанные caller, про который я спрашивал и callee. Возьмите, хотя бы, Essential ActionScript 2.0, все станет просто и понятно. И потом, если вы не заметили, приемлимый вариант приватности уже привели (хотя мой вариант мне гораздо больше нравится, чем у wxvxw, потому что у меня функция не видна снаружи вообще).

Ваш объект активации, суть объект, в контексте которого вызывается функция, т. е. в его области видимости. При использовании кейворда new создается новая область видимости. В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена:

Код:
o = new Object();
o.toString = function() {
	return 'object o';
}
a = new Object();
a.toString = function() {
	return 'object a';
}
function test() {
	trace(this);
}
o.test = test;
a.test = test;
test(); // _level0
o.test(); // object o
a.test(); // object a
trace([test==o.test, test==a.test]); // true,true
В AS2 для предотвращения такого поведения был придуман класс Delegate, изменяющий (делегирующий) область видимости функции в нужную. Вам несколько раз намекали, что приватная функция должна работать в области видимости экземпляра класса, а не в иной. Присвоить приватную функцию экземляру вы не можете, потому что потеряется эта самая приватность, но вот вызывать функцию в контексте экземпляра вы могли, но не сделали этого, а завели ссылку на нужную область видимости, создавая дополнительные трудности из-за разного способа доступа к свойствам и методам. Да, и забудьте про «объекты активации», оперируйте понятием «область видимости», которое понимают программисты, а не Дмитрий Гурский. Надеюсь, я доходчиво описал то, о чем вы тут нам хотели рассказать. А поэтому, предлагаю двигаться дальше к вопросу объектно-ориентирован ли AS1 или нет.


Последний раз редактировалось etc; 01.07.2008 в 10:47.
Старый 01.07.2008, 11:31
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 392  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
2 __etc:
Цитата:
Ваш объект активации, суть объект, в контексте которого вызывается функция, т. е. в его области видимости. При использовании кейворда new создается новая область видимости.
Не совсем так. Область видимости не изменится. Из вложенной функции вы сможете вызывать переменные и функции всех внешних функций и рута.
А this - всегда указывает на "объект активации", то есть если функция не будет вызвана, инициализирована - то this==undefined.
Цитата:
Вам несколько раз намекали, что приватная функция должна работать в области видимости экземпляра класса, а не в иной.
Так и есть, приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
И не приплетайте сюда больше this из классового ООП, там this указывает всегда на класс (и соответственно на каждый экземпляр), здесь - на "объект активации функции". К области видимости функции это отношение не имеет.
P.S: ну и у кого каша в голове?
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 01.07.2008 в 12:09. Причина: и каждый экземпляр
Старый 01.07.2008, 11:54
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 393  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от riden Посмотреть сообщение
А this - всегда указывает на "объект активации", то есть если функция не будет вызвана, инициализирована - то this==undefined.
Код:
setInterval(function () {
	trace (this); //undefined
}, 1000);
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 01.07.2008, 12:17
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 394  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
Цитата:
Сообщение от iNils
setInterval(function () {
trace (this); //undefined
}, 1000);
мда... у функции нет "объекта активации". Функция вызывается не объектом.
Под вызовом, инициализацией, я подрузомевал:
Код:
function func(){trace(this);}
//это
func();//_level0 // - TimeLine
//или
var obj = new func();// [object Object] // - obj
//и подобные вещи: вызов внутри другой функции (не методом, а
//непосредственно), которая тоже
//вызывается, инициализируется объектом
В любом случае, я просто писал о том, что область видимости != объект активации функции (по моему понятный термин).
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 01.07.2008 в 12:46. Причина: и подобные вещи
Старый 01.07.2008, 12:35
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 395  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Цитата:
Сообщение от riden Посмотреть сообщение
В любом случае, я просто писал о том, что область видимости != объект активации функции (по моему понятный термин).
итить. а Вы молодец. за 50своих постов, смогли доказать сам себе, что это разные вещи перечитайте пожалуйста внимательно и вдумчиво: http://www.flasher.ru/forum/showpost...&postcount=386

Старый 01.07.2008, 12:40
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 396  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
2 BloodHounD:
Я помню все что писал. Я и неговорю, что во всем был последователен. На меня также подействовало AS3, и эта путаница c this. Просто я счас написал, что __etc (#391) тоже это не понимает, в последних постах (#392).

Добавлено в 10:56
О, прочитал вашу ссылку, так вот о чем вы. Так это вы не понимате до сих пор о чем речь...
Еще раз могу послать вас сюда #389 - Читайте внимательно код и вдумывайтесь... И еще почитайте мой пост 392 внимательно.
P.S: а путаница у меня проскакивала (непоследовательность), только гораздо ранее.
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 01.07.2008 в 12:56. Причина: ссылки
Старый 01.07.2008, 12:51
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 397  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
У того же Гурского, на странице 203, написано:
Цитата:
В AS при вызове функции создается особая стуктура, называемая объектом активации.
Цитата:
что область видимости != объект активации функции
Об этом все и говорили, но также говорили, что this указывает на область видимости, а вы на объект активации. А получается, что вызов функции есть, а объекта активации - нет.
Далее, вы писали в 378 посте
Цитата:
this - указатель на объект активации функции, то есть на объект, который вызывает функцию, это может быть объект-экземпляр класса (функции). если функция вызывется из временной диграммы, то - ссылка на _level0, если функция внутри функции тупо лежит и не вызывается, то вы ничего не получите от this.
Модернизируем код выше
Код:
function a () {
	trace ("\t" + this);
}
setInterval(function () {
	trace (this);
	a ();
}, 1000);
согласно вашей цитате, а именно месту "на объект, который вызывает функцию" должно быть два undefined, однако получаем undefined и _level0
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 01.07.2008, 12:51
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 398  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от riden Посмотреть сообщение
Не совсем так. [u]Область видимости не изменится.
Это называется внешняя область видимости. Она не изменяется, да, а this (ссылка на рабочую область видимости, на объект, если уж вам так хочется) — изменяется.

Цитата:
Сообщение от riden Посмотреть сообщение
Так и есть, приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
И не приплетайте сюда больше this из классового ООП, там this указывает всегда на класс (и соответственно на каждый экземпляр), здесь - на "объект активации функции". К области видимости функции это отношение не имеет.
P.S: ну и у кого каша в голове?
У вас каша. Вы трындите о том, что локальная функция не работает в области видимости экземпляра класса (обратите внимание на выделенное слово). Я прекрасно знаю, что сама по себе без лишних телодвижений она так не работает, в отличие от AS3. Слово «должна» в моих высказываниях означает, что надо сделать так, чтобы эта функция себя так вела, а вы продолжаете уже черт знает какой пост подряд твердить одно и то же про «не приплетайте сюда AS3» и что она так не работает. Не работает — значит надо сделать, чтобы работало именно так. А вы влепили костыль в виде ссылки на экземпляр, опять же, не зная про call и apply.

Вы мой код вообще видели из поста #379? Вы внимательно читали пост #391 в отношении к областям видимости и делегированию или нет? Похоже, что нет, о чем тогда разговаривать?

p.S.:
Есть одна хорошая цитата из книги «Объектно-ориентированное программирование на ActionScript 1» Брендана Холла и Сэмюэла Ван в отношении объектно-ориентированности AS1: «Наследование в ActionScript — уродливое, запутанное дело со можеством всяких ям и ловушек. Плохо, что приходится столько знать о внутреннем устройстве ActionScript, чтобы заставить работать такое элементарное понятия ООП, как наследование».

Старый 01.07.2008, 13:02
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 399  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
2 Inils: ну я же понятно написал, о различии вызова объектом и методом, или нет?
Поэтому и называется - "объект активации функции". Процитирую свой отредактированный пост:
Цитата:
//и подобные вещи: вызов внутри другой функции (не методом, а
//непосредственно), которая тоже
//вызывается, инициализируется объектом
__________________
видеоигры - высший вид искусства

Старый 01.07.2008, 13:07
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 400  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
2 __etc:
Цитата:
Сообщение от __etc
Вы трындите о том, что локальная функция не работает в области видимости экземпляра класса (обратите внимание на выделенное слово).
Я пишу:
Цитата:
приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
Это значит, что все переменные (свойства) во внешней функции (классе) видны. Все свойства внутри тела класса (функции) копируются, с созданием экземпляра. И можно также (как и в AS3, например this[область видимости экземпляра]-parent) через ссылку на this-класса, получить доступ к руту экземпляра.
P.S: нет, похоже, это у вас все таки каша в голове.
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 01.07.2008 в 13:15. Причина: как и в AS3
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.