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

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

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Цитата:
Сообщение от riden Посмотреть сообщение
Ложь. prototype нужен только лишь для организации наследования, как
Код:
Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса).
Ну здрасте-приехали. Еще и во лжи объявили...
Если уж на то пошло, то и as1 класс создается НА ЭТАПЕ ИСПОЛНЕНИЯ кода в кадре, так что нет существенной разницы - добавили вы метод в конструкторе (так уж и быть, "теле" класса), или через prototype. Куда важнее, что а) - сохраняется область видимости; б) - все методы и свойства, добавленные в прототип, распространяются на ВСЕ экземпляры класса, а не создаются каждый заново при создании экземпляра. По мне, это куда ближе к концепции ООП.
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
P.S. Задержался с ответом, но все же.
__________________
...Тебе страшно? Мне - нет.

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

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Ромастый Посмотреть сообщение
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
Ну так мы же обеспечивали инкапсуляцию на уровне языка
Понятное дело, что проще инкапсулировать методы в собственной голове и закрыть глаза на то, что приваты торчат наружу.

Старый 30.06.2008, 15:22
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 3  
Ответить с цитированием
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
  № 4  
Ответить с цитированием
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
  № 5  
Ответить с цитированием
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
  № 6  
Ответить с цитированием
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
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 30.06.2008, 17:02
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 8  
Ответить с цитированием
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
  № 9  
Ответить с цитированием
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 — ООП-язык». То, что на встроенном уровне есть какие-то классы и простое наличие объектов не делает язык по настоящему объекто-ориентированным.

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

Регистрация: Jun 2005
Сообщений: 147
Цитата:
Сообщение от __etc
riden просто до сих пор не знает, как использовать call и apply, поэтому начинает нести пургу относительно this, то рассказывая про то, что он суть arguments.caller, то соглашался, что это ссылка на область видимости, теперь опять arguments.caller.
Никогда такого не говорил. Объект активации, область видимости... называйте как угодно... this - это указатель на объект активации функции, я уже приводил код. Если вы не понимаете сути this, и кокое он имеет отношение к функции, ваши проблемы. Я уже приводил код... тогда еще раз...
Код:
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
*/
Цитата:
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.
Мы кажется говорим про приватный метод. Что за бред: "функция не работает как метод"? Приватный метод - тоже что и локальная функция.
А если хотитие чтобы функция работала как метод, то надо сделать вот так: this.свойство = функция.

Цитата:
Сообщение от wvxvw
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
Нет таких обстоятельств, всегда можно вызвать локальную функцию в теле родного класса.

Еще раз, почему функция в AS1 - это и конструктор и тело класса...
Во первых, потому что:
Цитата:
Сообщение от riden
Функция в AS1, которая имеет объект активации в виде объекта инициализированного оператором new, и есть класс, так как с этого момента (new) this данной функции будет ссылатся на объект активации, на каждый экземпляр и заполнять пустой объект свойствами this."свойство".
Во вторых: Так как все что находится в теле функции-класса, реально копируется при создании экземпляра, а вот все что снаружи - всего лишь получает ссылку. Убедится в этом очень просто:
Код:
function func1(){}; // Создаем внешнюю функцию
func1.prop2=1; // Присваиваем функции свойство
function Class1(){ // Функция-класс
     function func2(){}; // Создаем внутреннюю функцию
     func2.prop=1; // Присваиваем внутренней функции свойство
     this.method1=func1; // Создаем методы, ссылаясь на внутреннюю
     this.method2=func2; // и внешнюю функции
	 
}
var obj1=new Class1(); // Создаем два объекта класса Class
var obj2=new Class1();
obj1.method1.prop=2; // Переопределяем свойства функций методов
// одного из объектов
//obj1.method2.prop=2;
trace(obj2.method1.prop); // Выводит: 2 (свойство было изменено)
trace(obj2.method2.prop); // Выводит: 1 (свойство осталось неизменным)
2 __etc (#370): мы говорим сейчас про реализацию приват и паблик, не отступайте от темы... или признайте, что вы не правы.
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 30.06.2008 в 20:00.
Создать новую тему Ответ Часовой пояс GMT +4, время: 21:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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