Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Битва гигантов: AVM1 vs. AVM2. Спешите видеть! Только у нас! (http://www.flasher.ru/forum/showthread.php?t=113128)

etc 01.07.2008 13:16

Цитата:

Сообщение от riden (Сообщение 749180)
Это значит, что все переменные (свойства) во внешней функции (классе) видны.

Но не экземпляра. А нужно экземпляра, последний раз об этом говорю (я даже нужный код уже привел фиг знает, когда, а вы все не унимаетесь), так что лично я закончил тему по поводу объектов активации. Я уже три десятка постов назад продолжил тему объектно-ориентированности AS1, а вы всё тянете свои чертовы объекты активации, хотя речь шла вообще о реализации приватов в AS1 и они реализованы уже. Сейчас речь идет о реализации всех трех принципов ООП одновременно, на основе AS3-варианта. Если вы не хотите в этом участвовать — пожалуйста, не мешайте другим, в особенности товарищу индейцу.

Цитата:

Сообщение от riden (Сообщение 749180)
P.S: нет, похоже, это у вас все таки каша в голове

Я, в отличие от вас, не редактирую по 10 раз посты после того, как на первоначальные редакции уже были даны ответы. Если вы будете продолжать сначала писать одно, потом редактировать и писать другое через полчаса, тогда мне не о чем с вами разговаривать. После этого вы начинаете утверждать, что, якобы, у меня каша в голове.

iNils 01.07.2008 13:30

Цитата:

...инициализируется объектом
Код:

function a () {
        trace (this);
}
function b(){
        trace (this);
        a()
}
new b()
setInterval(a, 1000);

[object Object]
_level0
undefined

Ну вот откуда тут _level0?

Яски 01.07.2008 13:47

Цитата:

Сообщение от BlooDHounD (Сообщение 749079)
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким :)

А кто вдруг решил, что в ООП обязательно должен быть this, что должны быть классы, множественное наследование. Например, в Си++ есть перегрузка операторов, но это дополнительная возможность, которой нет в истинном определении ООП.

Цитата:

Сообщение от __etc (Сообщение 749126)
А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.

Может на эту тему тоже поспорим? :)

Цитата:

Сообщение от __etc (Сообщение 749126)
Кстати, наследование реализуется не так, как вы написали, ... Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__.

Спасибо, я и не знал.

Цитата:

Сообщение от __etc (Сообщение 749126)
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на AS3 я привел. Истинно объектно-ориентированным языком можно назвать тот язык, который позволяет на уровне языка реализовать три принципа ООП сразу вместе на парочке классов, а не по отдельности, причем, реализованных средствами самого языка, а не руками, как тут уже всю тему пытаются сделать.

Да, пожалуйста:

Код:

function IMyClass(){
        this.getRotation = function(){
                return 'abstract method'
        };
};

function MyClass() {
        this.__proto__ = IMyClass;
       
        this.angle = 0;
       
        var calculateValue = function () {
                this.angle = 2*Math.PI*Math.random();
        };
        this.getRotation = function() {
                calculateValue.call(this);
                return this.angle/Math.PI*180;
        };
};

function AnotherMyClass() {
        this.__proto__ = MyClass;

        this.getRotation = function() {
                var        rotation = this.__proto__.getRotation();
                return rotation/2;
        };
        this.getRadians = function() {
                return this.angle/2;
        }
};

var iMyClass = new IMyClass();
var myClass = new myClass();
var aMyClass = new AnotherMyClass();

trace(iMyClass.calculateValue()) // "undefined"
trace(iMyClass.getRadians()) // "undefined"
trace(iMyClass.getRotation()) // "abstract method"
trace(iMyClass.angle) // "undefined"

trace(myClass.calculateValue()) // "undefined"
trace(myClass.getRadians()) // "undefined"
trace(myClass.getRotation()) // "152.942357249558"
trace(myClass.angle) // "2.66934769976621"

trace(aMyClass.calculateValue()) // "undefined"
trace(aMyClass.getRadians()) // "1.3346738498831"
trace(aMyClass.getRotation()) // "102.746495101601"
trace(aMyClass.angle) // "3.58652926881432"

Даже немного компактнее получилось.

Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса. Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.

etc 01.07.2008 14:21

Цитата:

Сообщение от Яски (Сообщение 749194)
Может на эту тему тоже поспорим? :)

JavaScript такой же псевдо-ООП, как и AS1, нет разницы. Ещё раз говорю, что язык вам позволяет реализовывать ООП, куцое, правда. Но у него нет средств для обеспечения той же приватности или полиморфизма, эти вещи разработчик просто в голове держит и все.

Цитата:

Сообщение от Яски (Сообщение 749194)
Да, пожалуйста:

Код:

function IMyClass(){
        this.getRotation = function(){
                return 'abstract method'
        };
};

function MyClass() {
        this.__proto__ = IMyClass;
       
        this.angle = 0;
       
        var calculateValue = function () {
                this.angle = 2*Math.PI*Math.random();
        };
        this.getRotation = function() {
                calculateValue.call(this);
                return this.angle/Math.PI*180;
        };
};

function AnotherMyClass() {
        this.__proto__ = MyClass;

        this.getRotation = function() {
                var        rotation = this.__proto__.getRotation();
                return rotation/2;
        };
        this.getRadians = function() {
                return this.angle/2;
        }
};

var iMyClass = new IMyClass();
var myClass = new myClass();
var aMyClass = new AnotherMyClass();

trace(iMyClass.calculateValue()) // "undefined"
trace(iMyClass.getRadians()) // "undefined"
trace(iMyClass.getRotation()) // "abstract method"
trace(iMyClass.angle) // "undefined"

trace(myClass.calculateValue()) // "undefined"
trace(myClass.getRadians()) // "undefined"
trace(myClass.getRotation()) // "152.942357249558"
trace(myClass.angle) // "2.66934769976621"

trace(aMyClass.calculateValue()) // "undefined"
trace(aMyClass.getRadians()) // "1.3346738498831"
trace(aMyClass.getRotation()) // "102.746495101601"
trace(aMyClass.angle) // "3.58652926881432"

Даже немного компактнее получилось.

Мой трейс:

Цитата:

Сообщение от Flash CS3
undefined
undefined
abstract method
undefined
undefined
undefined
undefined
undefined
undefined
NaN
NaN
undefined

Не работает, вы не находите?

Цитата:

Сообщение от Яски (Сообщение 749194)
Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса.

Если рассматривать понятие ООП как более абстрактное, программирование с использованием понятия объектов, то тогда большинство языков объектно-ориентированные.


Цитата:

Сообщение от Яски (Сообщение 749194)
Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.

Я уже говорил, что я согласен на формулировку, что AS1 — ООП язык, но только с приставкой «псевдо». Class-based языки — ООП языки без приставок.

p.S. В моем нике всего три буквы и два подчеркивания, но почему в нём постоянно делают ошибки? То буквы местами перепутают, то «c» с «s», то одно подчеркивания вместо двух (хотя подчеркивания можно и опустить совсем).

BlooDHounD 01.07.2008 14:24

Яски, есть ООП, а есть возможности языка :) с вашей логикой Вы мне можите доказывать, что Джава не язык программирования вовсе, так как там нету класса MovieClip :) что за бред Вы несёте про this, про inline-методы, перегрузка операторов? какое отношение к ООП они имеют? миксинг классов вообще фактически с точки зрения ООП, противопоказан.

Ромастый 01.07.2008 15:33

Цитата:

Сообщение от riden (Сообщение 748917)
Ложь. prototype нужен только лишь для организации наследования, как
Код:

Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса).

Ну здрасте-приехали. Еще и во лжи объявили... :eek:
Если уж на то пошло, то и as1 класс создается НА ЭТАПЕ ИСПОЛНЕНИЯ кода в кадре, так что нет существенной разницы - добавили вы метод в конструкторе (так уж и быть, "теле" класса), или через prototype. Куда важнее, что а) - сохраняется область видимости; б) - все методы и свойства, добавленные в прототип, распространяются на ВСЕ экземпляры класса, а не создаются каждый заново при создании экземпляра. По мне, это куда ближе к концепции ООП.
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
P.S. Задержался с ответом, но все же.

etc 01.07.2008 15:52

Цитата:

Сообщение от Ромастый (Сообщение 749233)
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.

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

chingachgoog 01.07.2008 16:00

Цитата:

Сообщение от __etc (Сообщение 748837)
Я буду скучен и повторю ответ BlooDHounD: Ну вы же знаете ООП? Тогда откуда такие вопросы?

Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.

Цитата:

Сообщение от wvxvw
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller

Народ, ну вы даете. Надо же так не знать, что такое объект активации :(
argumetns.caller - указатель на объект функции, но не на объект активации. Это разные вещи.
this - тоже не указатель на объект активации. Это свойство объекта активации, показывающее, чьим методом является функция.

Код:

function A(){
        function B(){
                trace(this)
        }
        B()
}
A() // [type Object] - это объект активации функции A, но не функции B!

Объект активации во ФП6 можно просмотреть for in с помощью ASSetPropFlags(), будет видно что все локальные свойства (var) внутренние (вложенные) функции, массив arguments, свойство this - все это содержиться в объекте активации.

etc 01.07.2008 16:31

Цитата:

Сообщение от chingachgoog (Сообщение 749242)
Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.

Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка. В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.

Цитата:

Сообщение от chingachgoog (Сообщение 749242)
Объект активации во ФП6 можно просмотреть for in с помощью ASSetPropFlags(), будет видно что все локальные свойства (var) внутренние (вложенные) функции, массив arguments, свойство this - все это содержиться в объекте активации.

iNils привел код, в котором нет объекта активации и код, в котором он является рутом. Ваш этот объект активации можно достать лишь во вложенной функции и является недо-объектом (он даже в toString выводится как [type Object], а не [object Object], как другие объекты) и одновременно ссылкой на локальную область видимости родительской функции. Это не arguments.caller и не arguments.callee, да. Но особой пользы этот недо-объект не несет (его свойства в семерке скрыли от перечисления совсем, чтобы вопросов лишних не возникало), потому как локальная область видимости родительской функции доступна и без this, так как является внешней по отношению к вложенной функции.

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

И вообще, товарищ Гурский под объектом активации подразумевает как раз этот самый полуобъект-ссылку на локалку родительской функции, а вот большинство программистов, не знакомых с творчеством Гурского, под объектом активации понимают arguments.caller, т. е. метод/функция, вызвавший (активировавший) данный.

chingachgoog 01.07.2008 17:13

Цитата:

Сообщение от __etc (Сообщение 749245)
Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка.

Вы не ответили на вопрос. Инкапсуляция не имеет ничего общего с private. Приват может усилить инкапсуляцию, но не более.
Цитата:

Сообщение от __etc (Сообщение 749245)
В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.

Да, в языке AS1 нет слов интерфейс, приват и даже (о ужас!) класс. Тем не менее это язык ООП. Ибо нигде не сказано, что ООП язык ДОЛЖЕН иметь такие слова. Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов. У прототипных языков есть свои преимущества и надо их использовать, а не ворчать по поводу отсутствия интерфейсов.

Цитата:

Сообщение от __etc (Сообщение 749245)
iNils привел код, в котором нет объекта активации и код, в котором он является рутом.

Ничего подобного. Вы невнимательно прочитали мой предыдущий пост и все еще не в введении, что такое объект активации.
iNils привел код, где трассируется указатель this. А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)

Цитата:

Сообщение от __etc (Сообщение 749245)
И вообще, товарищ Гурский под объектом активации подразумевает как раз этот самый полуобъект-ссылку на локалку родительской функции, а вот большинство программистов, не знакомых с творчеством Гурского, под объектом активации понимают arguments.caller, т. е. метод/функция, вызвавший (активировавший) данный.

Тогда жаль, что "большинство программистов" не хотят знать как на самом деле работает код.

PS Кстати не __constructor__ а просто constructor

etc 01.07.2008 17:42

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Вы не ответили на вопрос. Инкапсуляция не имеет ничего общего с private. Приват может усилить инкапсуляцию, но не более.

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

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Ибо нигде не сказано, что ООП язык ДОЛЖЕН иметь такие слова. Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов. У прототипных языков есть свои преимущества и надо их использовать, а не ворчать по поводу отсутствия интерфейсов.

Да откройте википедию хотя бы, насчет должен. Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать (это доказывает наличие «легко достижимы» вместо «уже есть» из вашего текста). А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать. С тем же успехом ассемблер тоже объектно-ориентированный, ведь в нем тоже можно реализовать полиморфизм, наследование и инкапсуляцию, не так ли?

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов.

Подтвердите свои слова кодом, я привел пример инкапсуляции, наследования и полиморфизма на AS3. Перепишите пример под AS1, с сохранением инкапсуляции (нормальной приватности, без торчащих наружу методов), наследования и полиморфизма. У Яски код нерабочий.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Ничего подобного. Вы невнимательно прочитали мой предыдущий пост и все еще не в введении, что такое объект активации.
iNils привел код, где трассируется указатель this. А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)

А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности? Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Тогда жаль, что "большинство программистов" не хотят знать как на самом деле работает код.

И не должны знать, прочитайте цитату из книги моего поста #398. Программист не должен знать низкоуровневые особенности кода, ему нужно работать и писать работающий, а не сидеть и выпиливать ООП, на котором дай бог что-нибудь заработает.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
PS Кстати не __constructor__ а просто constructor

Т.е. вы не знаете, как работает extends под шестой плеер в AS1?

Я жду от вас кода.

Яски 01.07.2008 17:57

Цитата:

Сообщение от __etc (Сообщение 749211)
Ещё раз говорю, что язык вам позволяет реализовывать ООП, куцое, правда. Но у него нет средств для обеспечения той же приватности или полиморфизма, эти вещи разработчик просто в голове держит и все.

А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью. Например, в том же Си такой возможности нет.

Цитата:

Сообщение от __etc (Сообщение 749211)
Не работает, вы не находите?

Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.

Цитата:

Сообщение от __etc (Сообщение 749211)
Если рассматривать понятие ООП как более абстрактное, программирование с использованием понятия объектов, то тогда большинство языков объектно-ориентированные.

ООП является стандартом дефакто, совсем без него плохо.

Цитата:

Сообщение от __etc (Сообщение 749211)
Я уже говорил, что я согласен на формулировку, что AS1 — ООП язык, но только с приставкой «псевдо». Class-based языки — ООП языки без приставок.

Хорошо, называйте его "псевдо", но "прототипный" будет точнее.

Цитата:

Сообщение от BlooDHounD (Сообщение 749214)
Яски, есть ООП, а есть возможности языка :) с вашей логикой Вы мне можите доказывать, что Джава не язык программирования вовсе, так как там нету класса MovieClip :) что за бред Вы несёте про this, про inline-методы, перегрузка операторов? какое отношение к ООП они имеют? миксинг классов вообще фактически с точки зрения ООП, противопоказан.

Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.

etc 01.07.2008 18:10

Цитата:

Сообщение от Яски (Сообщение 749272)
А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью.

Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.

Цитата:

Сообщение от Яски (Сообщение 749272)
Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.

Нет, там побольше будет строчек, целых три.

Цитата:

Сообщение от Яски (Сообщение 749272)
Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.

Wiki
Из последнего абзаца основных понятий AS1 — подвид ООП, прототипный. Он использует не все исходные понятия ООП. Т. е., есть собственные прототипы, есть наследование. Остальное реализуется лишь на уровне собственных правил разработчика, которым он следует, язык в этом, увы, участия не принимает.

Яски 01.07.2008 18:31

Цитата:

Сообщение от __etc (Сообщение 749277)
Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.

Главное решить поставленную задачу, а инструмент для этого подойдет любой.

Цитата:

Сообщение от __etc (Сообщение 749277)
Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП

На этом спор можно закончить.

riden 01.07.2008 18:35

По поводу "объекта активации", областей видимости:
Код:

var e = 5;
function Class2(){
        this.e=0;
        trace(e); //5  //-видит, при создании экземпляра область
//видимости не поменялась как пишет __etc
        trace(this.e); //0 // е в объекте, this - указатель на объект.
//можете считать, что с созданием экземпляра, область
//видимости "расширилась", вопрос терминологии...
       
}
var o2 = new Class2();

Тоже происходит и с локальными функциями. Все они видят, и указатель this - здесь не причем.
Меня сбил с толку код wvxvw:
Код:

//wvxvw пишет про область видимости
function TClass () {
        //пытается скрестить строку с this - не вышло
        //+ внутри this указывает на другое
        function toBePrivate () { trace("Should be TClass: "+ this); }//так нельзя
        this.toString = function () { return "[TClass]" };
        this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);//[TClass]
t.callPrivateMethod(); //Should be TClass: undefined

Правильно вот так:
Код:

function TClass () {
        function toBePrivate () {
        this.toString = function () { return "[TClass Function]" };
        trace(this); //вот так можно, только this, без строк
        };
        this.toString = function () { return "[TClass]" };
        this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);//[TClass]
t.callPrivateMethod();//[TClass Function]

2 iNils:По этому, речь идет только о глобальных функциях (this==undefined), а в методах - все OK.
Я прокоментирую:
Код:

function a () {
        trace (this);
}
function b(){
        trace (this);
        a();//не знаю... Очевидно что функция a не относится к объекту класса b(),
        //это только ссылка на внешнюю функцию, которая лежит на
//таймлайне (_level0)
//Я уже писал, что все что находится вне тела класса - не копируется
//при создании экземпляра, а получает ссылку ...
}
new b(); // создается экземпляр класса b()

Подкорректируем...
Код:

function b(){
        function a(){trace (this); }
        trace (this);//[object Object] - указатель
//на экземпляр класса
        a(); //[type Object] - указатель на объект функции (b),
//я уже писал про это ...
}
new b();

По поводу области видимости экземпляра:
2 __etc:
Вы показали как работает указатель this в AS1. И что? Не надо их сравнивать (AS1, AS3);
Код:

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

Цитата:

Сообщение от =__etc
В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена

Где у вас здесь методы класса? если бы test() - был методом класса, он бы и работал, как "спрогаммирован". То есть instanceOfClass.test() - будет возвращать, то что нужно. И не важно кому его присвоят, откуда он ссылку получит.

Вы наверно не заметли.., а процитировали только мое одно предложение, я процитирую:
Цитата:

Сообщение от riden
Это значит, что все переменные (свойства) во внешней функции (классе) видны. Все свойства внутри тела класса (функции) копируются, с созданием экземпляра. И можно также (как и в AS3, например this[область видимости экземпляра]-parent) через ссылку на this-класса, получить доступ к руту экземпляра.

Аналогом parent DisplayObject в AS1 будет _parent мувика. Короче классы в ас1 работают также как в ас3 в этом смысле. И также можно узнать где лежит клип: this-класса._parent, и таким образом получить доступ к области видимости экземпляра. Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса". А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.

etc 01.07.2008 18:48

Цитата:

Сообщение от riden (Сообщение 749292)
Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса".

Нет, неправильно поняли.

Цитата:

Сообщение от riden (Сообщение 749292)
А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.

Очень просто — this. Я и так в каждом методе в AS3 нахожусь в этой области видимости и this ссылается на неё же. Я уже говорил вам, что «должна работать так» — это значит, что нужно сделать так, чтобы приваты работали, как они работают в AS3. Я приводил соответствующий код.

Цитата:

Сообщение от Яски (Сообщение 749286)
Главное решить поставленную задачу, а инструмент для этого подойдет любой.

Ну конечно, у нас есть детальки, мы сначала сделаем бензопилу, а потом будем ей рубить лес. Лично я предпочту язык с наличием бензопилы изначально.

Цитата:

Сообщение от Яски (Сообщение 749286)
На этом спор можно закончить.

И остаться при своих.

riden 01.07.2008 19:07

Цитата:

Сообщение от __etc
Очень просто — this. Я и так в каждом методе в AS3 нахожусь в этой области видимости и this ссылается на неё же.

Именно про это я и писал, уже давно: "доступ к переменным(свойствам) внешней функции-класса)".
Можно так:
Код:

function Class1(){
this.a="for __etc";
var link2this=this;
function pMet(){trace(link2this.a);}
this.met=function(){pMet();}
}
var o1=new Class1();
o1.met();

Можно так:
Код:

function Class2(){
var a = "for __etc"; //приват свойство
function pMet(){
//вуаля
trace(this.a);//:) - Вы так рвались к this
}
pMet();//вызов объектом-функции локальной функции pMet
          //нужно для открытия области видимости :)
}
var o2=new Class2();

Вы конешно напишите, что это не правильно... Но суть в реализации инкапсуляции, и она есть. Все остальное что вы скажите, я и так знаю (и сам это знаю) - #333

etc 01.07.2008 19:20

Цитата:

Сообщение от riden (Сообщение 749303)
Именно про это я и писал, уже давно: "доступ к переменным(свойствам) внешней функции-класса)".
Можно так:
Код:

function Class1(){
this.a="for __etc";
var link2this=this;
function pMet(){trace(link2this.a);}
this.met=function(){pMet();}
}
var o1=new Class1();
o1.met();

Можно так:
Код:

function Class2(){
var a = "for __etc"; //приват свойство
function pMet(){
//вуаля
trace(this.a);//:) - Вы так рвались к this
}
pMet();//вызов объектом-функции локальной функции pMet
          //нужно для открытия области видимости :)
}
var o2=new Class2();

Вы конешно напишите, что это не правильно... Но суть в реализации инкапсуляции, и она есть. Все остальное что вы скажите, я и так знаю (и сам это знаю) - #333

Боже мой, опять чертов костыль-ссылка. Давайте задам вопрос прямо: вы знаете, что такое call и apply? Не нужны мне приватные свойства, я их и без this получу, он мне не нужен для этого. Мне нужны публичные свойства экземпляра класса получить из this, без ссылки типа link2this. Вот код:

Код:

function Class1() {
        this.a = 10; // _публичное_ свойство
       
        function privateMethod() {
                trace(this.a); // хочу, чтобы вывело 10
        }
       
        this.publicMethod = function() {
                privateMethod();
        }
}
o = new Class1();
o.publicMethod();

Напишите или исправьте вариант так, чтобы работало this.a в приватном методе без использования ссылок типа link2this. Заодно познакомитесь с новым (судя по всему) для вас методами в AS1 (и вы наконец поймете, может быть, о чем я говорил всю дорогу) и мы тихо-мирно закроем вопрос по поводу приватов.

chingachgoog 01.07.2008 22:50

Цитата:

Сообщение от __etc (Сообщение 749266)
Приват и создан для инкапсуляции. Конечно, вы можете создать для себя правила, какие методы вызывать, какие нельзя и типа у вас инкапсуляция получилась. Отлично.

Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.
А так как вы отказываетесь говорить, какие вы видите цели в привате, то глупо утверждать, что ничего подобного нет в AS1.

Цитата:

Сообщение от __etc (Сообщение 749266)
Да откройте википедию хотя бы, насчет должен.

Ага, отлично - википелия :) Там, кстати AS к ООП относят (явно не 3-й)
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)

Цитата:

Сообщение от __etc (Сообщение 749266)
...я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать... А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать.

Что значит САМОМУ? Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть. Правда почему-то их обозвали "хаками", "костылями" и т.п. Но это только с точки зрения ООП на классах. А как можно судить об AS1 как языке ООП с точки зрения AS3? Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface? Нет? Правильно. Потомучто нужно смотреть с точки зрения общей парадигмы ООП.

Цитата:

Сообщение от __etc (Сообщение 749266)
Подтвердите свои слова кодом

Код:

function Polymorph(){
}
Polymorph.prototype.getAngle=function(angle){
        trace(this.getSin(angle))
}

function Degree(){
}
Degree.prototype.getSin=function(angle){
        function convert(){
                return angle*Math.PI/180
        }
        return Math.sin(convert())
}

function Radian(){
}
Radian.prototype.getSin=function(angle){
        return Math.sin(angle)
}

obj=new Polymorph()

Polymorph.prototype.__proto__=Degree.prototype
obj.getAngle(90) // 1
obj.getAngle(Math.PI/2) // 0.0274121335920443

Polymorph.prototype.__proto__=Radian.prototype
obj.getAngle(90) // 0.893996663600558
obj.getAngle(Math.PI/2) // 1

Хотите - перепишите на AS3 :)

Цитата:

Сообщение от __etc (Сообщение 749266)
А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности?

А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?


Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.

Цитата:

Сообщение от __etc (Сообщение 749266)
Программист не должен знать низкоуровневые особенности кода

Ну значит вам не надо :)
А мне надо и интересно.

etc 01.07.2008 23:46

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.

А что обеспечивает инкапсуляцию, хотелось бы услышать.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А так как вы отказываетесь говорить

Я вами треплюсь уже 400 с лишним ответов в этой теме и я после этого отказываюсь? Если бы я отказывался, я бы тут вообще ни поста не оставил.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
какие вы видите цели в привате

Инкапсуляция, инкапсуляция, инкапсуляция, черт вас возьми, сколько можно? Я понимаю, что мыслить проектами до 2 килострок какой-то там инкапсуляцией и полиморфизм с наследованием сложно, да. Ой, как я вас понимаю.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
(явно не 3-й)

С потолка взяли?

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)

Да хоть назовите «коробочка», смысл от этого не меняется, не обеспечивает AS1 инкапсуляции, вам её самому надо реализовывать, с кучей недостатков. Вы придираетесь к самому наличию/отсутствию кейворда «private», а не к сути такого понятия, как приватность. Не реализована эта инкапсуляция на уровне языка в AS1, никаким образом, ни кейвордом, никак, вы это сами подтвердили высказыванием о том, что её можно легко реализовать. То, что у меня есть четыре колеса, вовсе не означает, что их можно назвать автомобилем. Вы из подручных средств пытаетесь собрать этот самый автомобиль, чтобы попытаться на нем поехать и при этом, всю эту кучу хлама, из которого собираетесь сделать автомобиль (не зная вообще, поедет ли он), уже называете это автомобилем.



Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Что значит САМОМУ?

Что значит? Наследование как реализовали? Через очень интересное свойство __proto__, очень документированное, руками. Не простым кейвордом extends без плясок, а аж пять строчек. Инкапсуляция как реализована? Последние страниц десять с горем пополам что-то сделали, и то, такой вариант не живет с наследованием, не говоря уже о забиванием памяти одинаковыми методами, которые даже экземпляру класса не принадлежат.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть.

Какие? extends — нету. private — нету. Интерфейсы? А что это такое? Ничего этого нет, вы для себя это придумываете, в мозгу, мол, вот такие методы вызывать нельзя, а эти переменны трогать тоже. Язык вам тут не поможет, он не умеет сам по себе такие вещи делать.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А как можно судить об AS1 как языке ООП с точки зрения AS3?

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Потомучто нужно смотреть с точки зрения общей парадигмы ООП.

С точки зрения ООП как раз таки, а не AS3. AS3 взят в качестве примера, если хотите, можно взять в качестве примера Java или C#, не принципиально.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface?

В AS1 нет полиморфизма, он просто настолько далек от этого, что просто не знает в принципе, что это такое.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Код:

function Polymorph(){
}
Polymorph.prototype.getAngle=function(angle){
        trace(this.getSin(angle))
}

function Degree(){
}
Degree.prototype.getSin=function(angle){
        function convert(){
                return angle*Math.PI/180
        }
        return Math.sin(convert())
}

function Radian(){
}
Radian.prototype.getSin=function(angle){
        return Math.sin(angle)
}

obj=new Polymorph()

Polymorph.prototype.__proto__=Degree.prototype
obj.getAngle(90) // 1
obj.getAngle(Math.PI/2) // 0.0274121335920443

Polymorph.prototype.__proto__=Radian.prototype
obj.getAngle(90) // 0.893996663600558
obj.getAngle(Math.PI/2) // 1


И где здесь мой вариант на AS3, переписанный под AS1? Где публичное свойство angle у экземпляра класса? Где работа приватного метода с ним? Где наследование свойства? Не вижу. Я вижу две функции, одна вызывает другую и молча возвращает посчитанное значение на основе аргумента. Никакой работы с экземпляром класса, гениально просто.
Я вас прошу написать точный аналог моего кода, который описывает все три принципа ООП в двух классах + интерфейс. Интерфейс и полиморфизм, вы, конечно, показать не сможете, ибо ни того, ни другого нет в AS1 и реализовать их собственными силами вам не удастся, покажите хотя бы код, являющийся точной копией моему, но на AS1. Т. е. те же свойства, приватность, методы, переопределение и т. д.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?

Вы меня объявили в некомпетентности, не удосужовшись прочитать дальнейший текст, каким тут боком iNils? Вы не прочитали текст до конца, потом тут же пишете тоже самое и говорите, что я что-то не понимаю? Оригинально.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Ну значит вам не надо :)
А мне надо и интересно.

Вот именно, что вам интересно. Вам нравится реализовывать ООП на коленке, это уже и так понятно.

wvxvw 02.07.2008 00:23

Если чесно, я уже потерял всякую надежду на то, что здравый смысл когда-нибудь возьмет верх =) Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее... Так же и с вами, на любой разумный аргумент отыскивается все больше и больше далеко идущих в своей абсурдности контраргументов. =) Но все равно, сколько бы вы ни старались, убедить в том, что междугородние поездки на самокате ни в чем не успупают электричкам у вас не получится =) И тем не менее, вы все равно будете называть самокат ультимативным средством междугороднего сообщения =)

И возвращаясь к истокам темы :D то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!

iNils 02.07.2008 00:27

Цитата:

Сообщение от riden (Сообщение 749292)
По этому, речь идет только о глобальных функциях (this==undefined), а в методах - все OK.
Я прокоментирую:
Код:

function a () {
        trace (this);
}
function b(){
        trace (this);
        a();
}
new b(); // создается экземпляр класса b()

не знаю... Очевидно что функция a не относится к объекту класса b(), это только ссылка на внешнюю функцию, которая лежит на таймлайне (_level0)
Я уже писал, что все что находится вне тела класса - не копируется при создании экземпляра, а получает ссылку ...

А это прокомментируете?
Код:

function a () {
        trace (this);
}
function b () {
        trace (this);        //[object Object]
        this.c = a;
        a ();                //_level0
        this.c ();          //[object Object]
        trace (this.c == a); //true
}
new b ();

Цитата:

Сообщение от wvxvw (Сообщение 749372)
Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее...

Как нет? Зимой на форуме тусовался, сам видел :D

etc 02.07.2008 00:28

Цитата:

Сообщение от wvxvw (Сообщение 749372)
Если чесно, я уже потерял всякую надежду на то, что здравый смысл когда-нибудь возьмет верх =) Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее... Так же и с вами, на любой разумный аргумент отыскивается все больше и больше далеко идущих в своей абсурдности контраргументов. =) Но все равно, сколько бы вы ни старались, убедить в том, что междугородние поездки на самокате ни в чем не успупают электричкам у вас не получится =) И тем не менее, вы все равно будете называть самокат ультимативным средством междугороднего сообщения =)

И возвращаясь к истокам темы :D то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!

Подписываюсь под каждой буквой :)
Копии своего кода я все-равно не получу, а убеждать индейца в том, что базука круче его тамагавка мне уже, честно говоря, осточертело.

chingachgoog 02.07.2008 01:07

Цитата:

Сообщение от __etc (Сообщение 749361)
А что обеспечивает инкапсуляцию, хотелось бы услышать.

По сути - только оговоренный интерфейс "черного ящика": мы знаем как и что туда кладем и знаем как и что достаем. Что происходит внутри - не важно. Вот и все, без приватов и т.п.

Цитата:

Сообщение от __etc (Сообщение 749361)
Инкапсуляция, инкапсуляция, инкапсуляция, черт вас возьми, сколько можно?

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

Цитата:

Сообщение от __etc (Сообщение 749361)
С потолка взяли?

Там же к ООП относят и JS - не о чем не говорит?

Цитата:

Сообщение от __etc (Сообщение 749361)
...не обеспечивает AS1 инкапсуляции, вам её самому надо реализовывать, с кучей недостатков.

Точно также надо ее самому обеспечивать в AS3.

Цитата:

Сообщение от __etc (Сообщение 749361)
Вы придираетесь к самому наличию/отсутствию кейворда «private», а не к сути такого понятия, как приватность. ... То, что у меня есть четыре колеса, вовсе не означает, что их можно назвать автомобилем.

Ровно поэтому я и спрашиваю о ЦЕЛИ приватности.

Цитата:

Сообщение от __etc (Сообщение 749361)
Что значит? Наследование как реализовали? Через очень интересное свойство __proto__, очень документированное, руками. Не простым кейвордом extends без плясок, а аж пять строчек.

Т.е. extends - это не самому реализовывать? А __proto__ - самому? И какие еще пять строчек?
А то что поначалу __proto__ был "очень документирован" - так это вина адоба, а не AS1, не так ли?

Цитата:

Сообщение от __etc (Сообщение 749361)
Инкапсуляция как реализована? Последние страниц десять с горем пополам что-то сделали, и то, такой вариант не живет с наследованием, не говоря уже о забиванием памяти одинаковыми методами, которые даже экземпляру класса не принадлежат.

Вы опять путаете инкапсуляцию с приватностью, а пока не будут оговорены ЦЕЛИ приватности - спорить тут глупо.

Цитата:

Сообщение от __etc (Сообщение 749361)
Какие? extends — нету. private — нету. Интерфейсы? А что это такое? Ничего этого нет, вы для себя это придумываете, в мозгу, мол, вот такие методы вызывать нельзя, а эти переменны трогать тоже. Язык вам тут не поможет, он не умеет сам по себе такие вещи делать.

Так я уже задал простейший вопрос - эти слова являются ОБЯЗАТЕЛЬНЫМ признаком языка ООП? Да или нет? Тогда зачем от прототипного языка требовать синтаксиса языка на классах?

Цитата:

Сообщение от __etc (Сообщение 749361)
В AS1 нет полиморфизма, он просто настолько далек от этого, что просто не знает в принципе, что это такое.

В моем коде он есть или у вас есть особое видение смысла полиморфизма?

Цитата:

Сообщение от __etc (Сообщение 749361)
И где здесь мой вариант на AS3, переписанный под AS1?

А где мой вариант переписанный под AS3?
Мой код показывает основные три принципа ООП в самом примитивном виде, не более. Просто пример.

Цитата:

Сообщение от __etc (Сообщение 749361)
Вы меня объявили в некомпетентности, не удосужовшись прочитать дальнейший текст, каким тут боком iNils? Вы не прочитали текст до конца, потом тут же пишете тоже самое и говорите, что я что-то не понимаю? Оригинально.

Не буду спорить - публика рассудит насколько "удачно" вы вплели в свой пост iNils-а.

Цитата:

Сообщение от __etc (Сообщение 749361)
Вот именно, что вам интересно. Вам нравится реализовывать ООП на коленке, это уже и так понятно.

Не исключено, что знай мы работу AVM2, то и private был бы по-другому рассмотрен.

Цитата:

Сообщение от wvxvw
И возвращаясь к истокам темы то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!

Электричка и самокат - это AVM1 и AVM2, так?
От адоба бы хотелось как минимум раскрыть все возможности самоката (сознательно им прикрытые).
Как максимум - сделать такую электричку, чтобы на ней ездили как левши, так и правши (как раньше на самокате). AS1 вполне такое позволяет.

etc 02.07.2008 01:29

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
По сути - только оговоренный интерфейс "черного ящика": мы знаем как и что туда кладем и знаем как и что достаем. Что происходит внутри - не важно. Вот и все, без приватов и т.п.

Договорившись с самим собой, ага. Не пойдет.


Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Инкапсуляция достижима и без приватности, так что вы опять не ответили на вопрос о цели приватности.

Я ОТВЕТИЛ, ЧЕРТ ВАС ДЕРИ! Вы мне уже конкретно начинаете напоминать персонажа, звонившнего в службу поддержки Стрима. Не опускайтесь до его уровня, прошу вас.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Там же к ООП относят и JS - не о чем не говорит?

Не говорит. Что AS1, что JavaScript, оба не имеют средств для контроля принципов ООП. Точка, больше повторять не буду, ибо надоело.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Точно также надо ее самому обеспечивать в AS3.

private+interface. Всё. Такие понятия есть и в AS3, и в Java, и в C# и ещё куче языков. В AS1 — НЕТ! Они отсутствуют по определению.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Ровно поэтому я и спрашиваю о ЦЕЛИ приватности.

См. выше.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Т.е. extends - это не самому реализовывать? А __proto__ - самому? И какие еще пять строчек?
А то что поначалу __proto__ был "очень документирован" - так это вина адоба, а не AS1, не так ли?


Вы опять путаете инкапсуляцию с приватностью, а пока не будут оговорены ЦЕЛИ приватности - спорить тут глупо.

Бла-бла-бла, опять же, см. выше ответ.


Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Так я уже задал простейший вопрос - эти слова являются ОБЯЗАТЕЛЬНЫМ признаком языка ООП? Да или нет?

ДА!

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Тогда зачем от прототипного языка требовать синтаксиса языка на классах?

Я не требую, это вы заявили, что AS1 — чисто ООП язык. Это не так, это псевдо-ООП максимум. Точка.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
В моем коде он есть или у вас есть особое видение смысла полиморфизма?

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

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
А где мой вариант переписанный под AS3?

Нигде, с вашим понятием полиморфизма такое можно написать только на JavaScript и других прототипных языках, у которых стол может стать стулом без проблем простой заменой прототипа.

Цитата:

Сообщение от chingachgoog (Сообщение 749386)
Мой код показывает основные три принципа ООП в самом примитивном виде, не более. Просто пример.

Угу, особенно полиморфизм удался.

wvxvw 02.07.2008 04:49

Вложений: 1
вот, немножко позитива на ночь глядя =) Сто лет уже инструменты в руки не брал =)

ЗЫ. *Коренные жители америки с распростертыми объятиями приняли новые технологии*

etc 02.07.2008 10:21

wvxvw, класс! :)

divinus 02.07.2008 12:49

wvxvw, +1... надо было вывешивать постов этак 200 назад ;)
класс!

chingachgoog 02.07.2008 12:53

iNils, riden, если хотите разобраться с объектами активации посмотрите посты 408 и 410.

Код:

function a () {
        trace ("f a this="+this);
        trace ("f a =="+(this.__proto__==b.prototype))
}
function b () {
        trace ("f b this="+this);        //f b this=[object Object]
        trace ("f b =="+(this.__proto__==b.prototype)) // f b ==true т.е. this - это в данном случае объект созданный оператором new
        this.c = a;
        a ();                //f a this=_level0
                                                //f a ==false функция а является методом рута, а не объекта созданного new
        this.c ();          //f a this=[object Object]
                                                //f a ==true функция a является методом объекта созданного new
        trace (this.c == a); //true
}
new b ();

wvxvw, улыбнуло :)

Цитата:

Сообщение от __etc (Сообщение 749392)
Договорившись с самим собой, ага. Не пойдет.

Что значит пойдет/не пойдет? Принципы ООП довольно общие и абстрактные. В них кстати вообще даже о классах речи не идет.
Тоже самое с принципом инкапсуляции. С точки зрения парадигмы ООП инкапсуляция достигается без всяких приватов. Примите это как факт. А вот с точки зрения любителей мертвых языков или других сторонников ООП на классах, это понятие (инкапсуляции) может быть более конкретизирована и ограничено. Но к общей парадигме ООП это уже никак не относится.

Цитата:

Сообщение от __etc (Сообщение 749392)
Я ОТВЕТИЛ, ЧЕРТ ВАС ДЕРИ! ...
...См. выше.
...Бла-бла-бла, опять же, см. выше ответ.

Я понял - для вас инкапсуляция не достижима без привата. В этом случае вы, конечно, ответили. Но эта ваша "инкапсуляция" - лишь частный случай инкапсуляции парадигмы ООП.

Цитата:

Сообщение от __etc (Сообщение 749392)
Не говорит. Что AS1, что JavaScript, оба не имеют средств для контроля принципов ООП. Точка, больше повторять не буду, ибо надоело.

Т.е. смотрим википедию и где нравится - цитируем, где не нравиться - опровергаем, так __etc? А ведь я всего лишь показал уровень википедии - не более.

Цитата:

Сообщение от __etc (Сообщение 749392)
private+interface. Всё. Такие понятия есть и в AS3, и в Java, и в C# и ещё куче языков. В AS1 — НЕТ! Они отсутствуют по определению.
...
ДА!
...Я не требую, это вы заявили, что AS1 — чисто ООП язык. Это не так, это псевдо-ООП максимум. Точка.

Ну вы бы так и сказали сразу, что не считаете прототипные языки - "истинно" ООП языками. Зачем стесняться?

Цитата:

Сообщение от __etc (Сообщение 749392)
Где? У вас один и тот же класс меняет поведение и родителя, это не полиморфизм, а полная чушь. Примерно как японец вдруг почернел и стал негром. Полиморфизм подразумевает наличие нескольких объектов, с одним интерфейсом. Внутренняя реализация в них разная, но интерфейс к объектам — одинаков. Вот это называется полиморфизмом
...

Вы опять абстрактное понятие парадигмы ООП суживаете до рамок ООП на классах. Полиморфизм - понятие действительно более интуитивное, чем конкретное (чего одно название стоит!). Но на самом деле тут не так все сложно. Это просто код, который ведет к различным результатам, в зависимости от наследования.
Интерфейсы - это всего лишь ОДИН ИЗ СПОСОБОВ ДОСТИЖЕНИЯ полиморфизма.
Да я взял один и тот же класс, но лишь для подчеркивания возможностей AS1. Метод getAngle полиморфен и в этом случае.

Цитата:

Сообщение от __etc (Сообщение 749392)
Нигде, с вашим понятием полиморфизма такое можно написать только на JavaScript и других прототипных языках, у которых стол может стать стулом без проблем простой заменой прототипа.

А что вас так злит в прототипных языкак? Что они смеют называться языками ООП? :) По-моему указанная возможность - весьма крутая вещь AS1.

Цитата:

Сообщение от __etc (Сообщение 749392)
Угу, особенно полиморфизм удался.

В рамках парадигмы ООП - удался. Код метода - один. Результат в зависимости от наследования - разный.

etc 02.07.2008 13:00

Цитата:

Сообщение от chingachgoog (Сообщение 749451)
Ну вы бы так и сказали сразу, что не считаете прототипные языки - "истинно" ООП языками. Зачем стесняться?

Я об этом последние все 400 постов в теме говорил. На этом я собираюсь прекратить дискуссию по этому поводу. У вас свое мировозрение и вы можете называть телегу с двигателем автомобилем исходя из определения, а я не могу, вот и все.

А картинка знатная, да.

iNils 02.07.2008 16:06

Цитата:

Сообщение от chingachgoog (Сообщение 749451)
если хотите разобраться с объектами активации посмотрите посты 408 и 410.

Ну давай. Смотрим пост 410, а именно его часть
Цитата:

А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
привожу следующий код (смотреть с компиляцией под 6-ый плеер)
Код:

cx = 1;
function a () {
}
function b () {
        function c () {
                ASsetPropFlags (this, null, null, 1);
                for (var i in this) {
                        trace ("\t" + i + " = " + this[i]);
                }
        }
        trace ((cx++) + ".");
        a.d = c;
        c ();
        trace ((cx++) + ".");
        a.d ();
}
b ()
new b ();
setTimeout (b, 1000);

он выдает следующее
Код:

1.
        c = [type Function]
        arguments =
        this = _level0
2.
        d = [type Function]
        prototype = [object Object]
        __proto__ = [object Object]
        constructor = [type Function]
3.
        c = [type Function]
        super = [object Object]
        arguments =
        this = [object Object]
4.
        d = [type Function]
        prototype = [object Object]
        __proto__ = [object Object]
        constructor = [type Function]
5.
        c = [type Function]
        super = [type Function]
        arguments =
        this =
6.
        d = [type Function]
        prototype = [object Object]
        __proto__ = [object Object]
        constructor = [type Function]

Особенно интересен пункт 5. Функция вложена, this есть и должен указывать на объект активации, а он показывает undefined (хотя там пустота, надо помнить, что в 6-ом плеере undefined не выводится в трейс, если в трейсе есть еще что-то). То есть, свойства объекта активации есть, а самого объекта нет! Это и доказывает, что this не ссылается на объект активации, о чем было заявлено в посте 410.

Дополнение, наткнулся на пост в блоге Нокса. Там он цитирует спецификацию ECMA-262
Цитата:

The activation object is purely a specification mechanism. It is impossible for ECMAscript program to access the activation object. It can access members of the activation object, but not the activation object itself.

Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.

chingachgoog 02.07.2008 16:38

Цитата:

Сообщение от iNils (Сообщение 749515)
Ну давай.
...
привожу следующий код (смотреть с компиляцией под 6-ый плеер)

Это изначальная ошибка. Дело не в компиляции под 6-й плеер, а в наличии самого 6-го плеера. Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен (по крайней мере для for in с ASsetPropFlags). Разумеется это было сделано не для того чтобы "прикрыть лавочку" или "не повадно было".
Т.е. если ты хочешь протестить свой код, то найди 6-й флеш-редактор (тот что MX) и протести там.

Цитата:

Сообщение от iNils (Сообщение 749515)
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.

Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно :)

add:
Код:

function b () {
        function c () {
                trace(this)
                z=this
        }
        c ();
}
b ()
trace(z)

ASsetPropFlags (z, null, null, 1);
                for (var i in z) {
                        trace ("\t" + i + " = " + z[i]);
                }

Получаем:

Код:

[type Object]
[type Object]
        c = [type Function]
        arguments =
        this = _level0

И ничего удивительного тут нет. Реальный this функции "с" показывает, как и ожидается на объект активации функции "b".
А этот объект активации (функции "b", а не "с"!) содержит в себе указатель this, куда? Правильно, на рут - тот объект, чьим методом является функция "b".

iNils 02.07.2008 17:27

Цитата:

Сообщение от chingachgoog (Сообщение 749537)
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно :)

Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.

Цитата:

Сообщение от chingachgoog (Сообщение 749537)
Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен

Гурского надо внимательнее читать :) Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.

chingachgoog 02.07.2008 17:50

Цитата:

Сообщение от iNils (Сообщение 749553)
Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.

Добавил в пост выше :) (то что называется z - и есть ссылка на объект активации)

Цитата:

Сообщение от iNils (Сообщение 749553)
Гурского надо внимательнее читать :) Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.

Точно.

Теперь продолжим с "доказывающим примером" :)

Код:

function b () {
        function c () {
                trace(this)
                z=this
        }
        c ();
}
setTimeout (b, 1000);

setTimeout(function(){
                                        trace(z)
ASsetPropFlags (z, null, null, 1);
                for (var i in z) {
                        trace ("\t" + i + " = " + z[i]);
                }
                                        },2000)

выводит:
Код:

[type Object]
[type Object]
        c = [type Function]
        super = [type Function]
        arguments =
        this =

Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации. ЧТД
А вот почему у функции-оболочки указатель this пустой - это надо спросить у тех, кто знает как устроены сетинтервалы и сеттаймауты.

iNils 02.07.2008 18:09

Цитата:

Сообщение от chingachgoog (Сообщение 749563)
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.

Цитирую Гурского, страница 205
Цитата:

this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
И спецификацию 2-ой раз
Цитата:

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

chingachgoog 02.07.2008 19:08

Цитата:

Сообщение от iNils (Сообщение 749565)
Цитата:

Сообщение от chingachgoog
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.

Цитирую Гурского, страница 205
Цитата:

this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция

Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.

Цитата:

Сообщение от iNils (Сообщение 749565)
И спецификацию 2-ой раз
...
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.

Движенья нет - сказал один мудрец. Другой встал и начал пред ним ходить... :)
Какое мне дело до спецификации, когда я только что при тебе сделал указатель на объект активации (z) и он действует уже ПОСЛЕ выполнения функции? В любое время к нему можно обратиться.

riden 02.07.2008 21:04

OOP AS1 В ДЕЙСТВИИ 3 in 1: инкапсуляция, наследование, полиморфизм
 
OOP AS1 В ДЕЙСТВИИ 3 in 1: инкапсуляция, наследование, полиморфизм
Следует заметить что НАСЛЕДОВАНИЕ в AS1 - более широкое понятие. Здесь - наследование на уровне экземпляр-класс, наследование свойств прототипов класса, надкласса, наследование свойств созданных внутри конструктора и пр... В этом плане AS1 более гибок... такое наследование позволяет экономить память, ресурсы компьютора.
Я покажу наследование - в "классическом" понимании, то есть как в AS3, Java, C#. Код:
*IA - in action, в действии
Код:

//Класс Rectangle - надкласс класса Square
function Rectangle(width,height){
        this.test = "test";
        var l2this=this;
        function Private(){trace(l2this.test);}//приват метод// ИНКАПСУЛЯЦИЯ IA
        this.callPrivate=function(){Private();}
        this.width=width;
        this.height=height;
        this.ctest=function(){l2this.test="null";}
        this.getArea=function(){return l2this.width*l2this.height;}
}


//наследование свойств созданных в конструкторе - НАФИГ
//Square.prototype = new Rectangle();

//для того что бы были видны свойства в прототипе надкласса - НАФИГ
//Square.prototype.__proto__= Rectangle.prototype;

//Класс Square - Подкласс класса Rectangle
function Square(size){
        this.superClass = Rectangle;

        //вызов этой функции обеспечивает истинный Полиморфизм :)
        //Передача параметров в надкласс //аналог super
        this.superClass(size,size);//вызывается каждый раз при создании экземпляра
       
        this.size=size;
        ASSetPropFlags(this,"width,height",7,null);//скрытие, защита непотребных свойств
        //trace(this.width);//4, 5 //НАСЛЕДОВАНИЕ IA #1 //OK, свойства видны
}

//создание объектов с различной площадью
var sq=new Square(4); //ПОЛИМОРФИЗМ IA #1
var sq2=new Square(5);
//sq.test="0";trace(sq2.test);//test //ПОЛИМОРФИЗМ IA #2 :)

//метод изменяет свойство test экземпляра sq
//sq.ctest(); trace(sq.test);trace(sq2.test);//null test//все ОК. ПОЛИМОРФИЗМ IA #3

//sq.width=30;trace(sq.width);//4 - OK // не переопределяется //ЗАЩИТА РАБОТАЕТ
//trace(sq2.width);//5 //у экземпляра есть свойство надкласса //НАСЛЕДОВАНИЕ IA #2

//у экземпляров есть метод надкласса
//trace(sq.getArea());//16 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3
//trace(sq2.getArea());//25 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3

AS1 - истинный ООП (2 __etc). Можно говорить лишь о качестве, а не о существовании.

iNils 02.07.2008 22:53

Цитата:

Сообщение от chingachgoog (Сообщение 749593)
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.

Ты не верно истолковываешь что такое объект активации. Object и объект активации это совсем разные вещи.
Код:

function b () {
        trace ("\tb:" + (this instanceof Object));
        function c () {
                trace (this);
                z = this;
                trace ("\t\t\t" + (this instanceof Object));
        }
        c ();
}
trace ("E")
e = new b ();
trace ("\tz:" + (z instanceof Object));
trace ("R")
r = b ();
trace ("\tz:" + (z instanceof Object));
trace ("Z")
setTimeout (b, 10);
setTimeout (function () {
        trace (z);
        trace ("\tz:" + (z instanceof Object));
}, 20);


Код:

E
        b:true
[type Object]
                        false
        z:false
R
        b:true
[type Object]
                        false
        z:false
Z
        b:false
[type Object]
                        false
[type Object]
        z:false

А ты знаешь, что любой объект наследуется от Object

iNils 02.07.2008 22:55

Цитата:

Сообщение от chingachgoog (Сообщение 749593)
Какое мне дело до спецификации...

Раз ты создал собственную область понимания, то разговор закончен.

etc 02.07.2008 23:09

riden, я просил точную копию своих классов. Мне не нужны другие примеры, я привел пример и прошу реализовать его же, на AS1. Без какого-либо вмешательства в схему.


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

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