![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
riden, вы уже давно ведетесь на уловки etc и пытаетесь переписать АС3 на АС1. С таким же успехом я могу доказать, что АС3 не ООП язык хотя бы потому, что в нем нет inline методов. Я перешел на АС3 совсем недавно и мне совсем не интересно изучать старую технологию. Но положение дел в этой теме меня совсем не устраивает, и я попытаюсь сам доказать, что АС1 - ООП язык. АС1 использует частный случай ООП - Прототипное_программирование. Так или иначе ООП предусматривает три основных парадигмы, рассмотрим каждую из них:
1) Инкапсуляция - способ скрыть внутреннее исполнение от внешней обертки function Base(){
var text = function(){
return 'private text'
};
this.method = function(){
return text() + ' returned from public'
};
};
var obj = new Base();
trace(obj.text()) // "undefined"
trace(obj.method()) // "private text returned from public"
function Extends() {
var base = new Base();
this.method = base.method;
this.method2 = function() {
return "added method to base class";
};
};
var obj2 = new Extends();
trace(obj2.text()) // "undefined"
trace(obj2.method()) // "private text returned from public"
trace(obj2.method2()) // "added method to base class"
function Extends2() {
var base = new Base();
this.method = function() {
return "this is " + base.method() + " of base class? No this overriden method off base class";
};
};
var obj = new Base();
var obj2 = new Extends2();
trace(obj2.text()) // "undefined"
trace(obj2.method()) // "this is private text returned from public of base class? No this overriden method off base class
"
Последний раз редактировалось Яски; 30.06.2008 в 22:28. |
|
|||||
|
Et cetera
Регистрация: 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
Последний раз редактировалось etc; 01.07.2008 в 10:47. |
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Цитата:
Цитата:
![]() Цитата:
Цитата:
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, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП. Последний раз редактировалось Яски; 01.07.2008 в 13:59. |
|
||||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
p.S. В моем нике всего три буквы и два подчеркивания, но почему в нём постоянно делают ошибки? То буквы местами перепутают, то «c» с «s», то одно подчеркивания вместо двух (хотя подчеркивания можно и опустить совсем). |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:56. |
|
|
« Предыдущая тема | Следующая тема » |
|
|