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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.06.2008, 14:53
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 361  
Ответить с цитированием
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
Код:
var x = new(function z(){
	var private = 'private';
	this.public = 'public';
	this.meth = function(){
		return [private, this.public];
	}
})()
alert(x.private) // undefined
alert(x.public) // "public"
alert(x.meth()) // "private, public"
x.private = '123';
alert(x.meth()) // "private, public"
под описание
Цитата:
* Приватным является такой метод, который можно вызвать из любого другого метода объекта, чьим методом он является, но ниоткуда более.
* Обязательным атрибутом приватного метода является невозможность его переопределения / удаления из-за пределов объекта, чьим методом он является.
подходит.

Цитата:
Создавать в конструкторе методы - где вы такое видели?
какая разница? что от этого поменяется? это дело синтаксиса и не более.
__________________
Breakcore them all!

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

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от KidsKilla Посмотреть сообщение
Код:
var x = new(function z(){
	var private = 'private';
	this.public = 'public';
	this.meth = function(){
		return [private, this.public];
	}
})()
alert(x.private) // undefined
alert(x.public) // "public"
alert(x.meth()) // "private, public"
x.private = '123';
alert(x.meth()) // "private, public"
А где тут приватный метод?

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

Регистрация: Jun 2005
Сообщений: 147
Цитата:
Сообщение от Ромастый
В AS1 методы создавались через prototype
Ложь. prototype нужен только лишь для организации наследования, как
Код:
Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса). Я уже приводил код, как это делается в теле класса.
2Ромастый... если вы не видели мой код, создание свойств и методов делается так в АС1, в теле класса:
Код:
var бла бла // приват свойство
функция(){одна одинешенька, на меня никто не ссилается} //приват метод
this.свойство = бла-бла // паблик свойство
this.свойство = функция //паблик метод
Цитата:
Сообщение от Ромастый
Вот только function AS1Class() {..} является не телом класса, а конструктором
Функция AS1 - это и конструктор и тело класса одновременно.

Цитата:
Сообщение от wvxvw
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller
Еще раз приведу свой код:
Код:
function Class1(){
this.a=1;
	trace (this); //[object Object]
	function localFunc(){
		this.b=2
		trace(this);//this получает ссылку в момент создания экземпляра
					//Выводит [type Object]
		trace(this.a); //undefined
		trace(this.b); //2
	}
	localFunc();
	//this.met = localFunc;
}
//Class1();
var c = new Class1();
//c.met();
/*Выводит:
[object Object] - ссылка на объект с
[type Object] - ссылка на localFunc() (я так думаю)
undefined - нет такого свойства в объекте
2
*/
Как вы видите, у каждой функции свой this.
И еще про область видимости. Вашим тупым аргументом является, то что this вызванное из функции без объекта активации, возвращает undefined. Вы применяете обман, и утверждаете что функция не видит "выше" (выше-вложенной функции, то есть функции-тела ласса). Так то что функция все видит, убедится очень легко... процитирую свой код...
Код:
......................
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
..................
Как видите переменная pa - видна в приватном методе, да и будет видна в паблик методе. По этому не понятны притензии, якобы не видит верхний this... Не видит потому что у каждой функции свой this в AS1, и вы сразу получаете указатель на другой объект, а вот в AS3 у функции нет this, поэтому и возможно обращение к классу из функции

Цитата:
Сообщение от wvxvw
>> В AS3 функции имеют более узкое назначение и применение

ложь =)
Попробуйте, в AS3, создать экземпляр функции, с помощью оператора new и увидите что будет

Цитата:
Сообщение от wvxvw
>> Ну и почему методы созданные на этапе исполнения(то есть когда создаются экземпляры классов) (пускай даже на временной диаграме) должны иметь доступ к приват-свойствам класса?

Это является обязательным атрибутом метода, иначе это не метод.

>> вне тела класса.

Вы путаете конструктор класса и сам класс.
Добавте таким же образом метод в динамический класс в АС3 - это называтся НА ЭТАПЕ ИСПОЛНЕНИЯ - и попытйтесь обратится к приватным свойствам класса, в который вы добавляете
Или у вас такой малый опыт програмирования, или что.. не знаю, что вы не можете провести аналогии между AS1 и AS3... Или на временной диаграме вы это зделаете, или в теле другого класса, к приват вы уже не имеете никакого отношения... Или вы напрочь забыли для чего приват свойста?
Функция в AS1, которая имеет объект активации в виде объекта инициализированного оператором new, и есть класс, так как с этого момента (new) this данной функции будет ссылатся на объект активации, на каждый экземпляр и заполнять пустой объект свойствами this."свойство".

Вот код, и апровержения я так и не увидел. Приватный метод pMetA(). Удачи
Код:
function Class1(){
//паблик свойство
this.a = 4;
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}

//паблик методы
function pmet1(){pMetA();}
function pmet2(){trace("do pmet2");}
this.met1=pmet1;//паблик метод
this.met2=pmet2; //паблик метод

}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();

trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10
Надоело разжовывать элементарные вещи,... удачи


Последний раз редактировалось riden; 30.06.2008 в 15:20.
Старый 30.06.2008, 15:22
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 364  
Ответить с цитированием
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
Цитата:
А где тут приватный метод?
Код:
var x = new(function z(){
	var private = function(){return 'private'};
	this.public = function(){return 'public'};
	this.meth = function(){
		return [private(), this.public()];
	}
})()
alert(x.private()) // Error
alert(x.public()) // "public"
alert(x.meth()) // "private, public"
x.private = function(){return '123'};
alert(x.meth()) // "private, public"
тоже мне педанты...
__________________
Breakcore them all!

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

Регистрация: Sep 2002
Сообщений: 30,787
riden просто до сих пор не знает, как использовать call и apply, поэтому начинает нести пургу относительно this, то рассказывая про то, что он суть arguments.caller, то соглашался, что это ссылка на область видимости, теперь опять arguments.caller.

KidsKilla, мне не хочется повторяться, но около пяти страниц назад riden приводил тот же код, я у него попросил код, в котором вызванный приватный метод изменяет значение публичного свойства данного класса. Так вот, теперь я прошу показать такой код.

А вообще, мне непонятно, если принять во внимание, что утверждение «AS1 — ООП язык», то этот самый язык должен реализовывать все принципы ООП, причем сразу вместе. Кто-нибудь может привести пример, в котором реализована сразу и инкапсуляция, и наследование, и переопределение с полиморфизмом. В AS3 это возможно, даже в AS2 (т.к. там был добавлен новый пикод extends для реализации наследования, которого нет в AS1). Если хотите, могу даже описать такой пример. С вас — реализация.

Старый 30.06.2008, 16:18
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 366  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
riden:
Вы упорно не хотите понять, что функция и метод это не одно и то же, и все время путаете и себя и остальных.
Метод - это часный случай функции. у метода обязан быть this, у функции - нет. А вы это не понимаете.
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
__________________
Hell is the possibility of sanity

Старый 30.06.2008, 16:55
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 367  
Ответить с цитированием
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
__etc
Код:
var x = new(function z(){
	var t = this;
	var private = function(){
		t.pub = function(){
			return 'smt changed'
		};
	};
	this.pub = function(){
		return 'public'
	};
	this.change = function(){
		private();
		return this;
	}
})()
alert(x.pub()) // "private"
alert(x.change().pub()) // "smt changed"
wvxvw, придираетесь к терминологии. "при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль." пример плз.
__________________
Breakcore them all!

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

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от KidsKilla Посмотреть сообщение
var t = this;
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.

Старый 30.06.2008, 17:02
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 369  
Ответить с цитированием
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
Цитата:
Сообщение от __etc Посмотреть сообщение
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.
=> АС1 не ООП =))) отличная логика.
__________________
Breakcore them all!

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

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от KidsKilla Посмотреть сообщение
=> АС1 не ООП =))) отличная логика.
Так прочитайте вторую часть моего поста, где я просил код. Был показан пример с приватным методом, т.е. метод инкапсулирован в класс (хоть и криво, менее кривым решением было бы использование call и apply и проблем с областями видимости не было бы). Но я хочу увидеть пример, реализовывающий сразу все принципе. Такой пример я сделал на AS3:

Код:
package {
	public class MyClass implements IMyClass {
		public function MyClass() {
			super();
		}
		
		public var angle:Number = 0;
		
		public function getRotation():Number {
			this.calculateValue();
			return this.angle/Math.PI*180;
		}
		
		private function calculateValue():void {
			this.angle = 2*Math.PI*Math.random();
		}

	}
}
Код:
package {
	public class AnotherMyClass extends MyClass {
		public function AnotherMyClass() {
			super();
		}
		
		public override function getRotation():Number {
			var rotation:Number = super.getRotation();
			return rotation/2;
		}
	}
}
Код:
package {
	public interface IMyClass {
		function getRotation():Number;
	}
}
Итак, три класса, MyClass, AnotherMyClass и интерфейс IMyClass. Инкапсулирован метод calculateValue, класс AnotherMyClass наследуется от MyClass, переопределяет метод и использует метод супер-класса, и все это сверху нафаршировано полиморфизмом (сигнатуры методов совпадают, поведение разное) в виде интерфейса IMyClass.

Я прошу привести реализацию этих двух классов на AS1, с учетом и реализацией уровней доступа к свойствам и переменных.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:45.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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