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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.03.2015, 01:45
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 11  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вы понимаете, что не можете унаследовать тот же Sprite от своего AbstractClass?
Вся загвоздка то в этом. Вы ставили задачу — чтобы любой класс мог стать нодой. Как сделать специальный класс-ноду — итак очевидно. Но унаследовать от него DisplayObject не получится.
Цитата:
Но вот если бы сам объект был и законченным объектом и нодой одновременно и это бы не противоречило ООП, то это было тем, о чем я и спрашиваю.
__________________
Reality.getBounds(this);

Старый 22.03.2015, 02:19
OlmerDale вне форума Посмотреть профиль Отправить личное сообщение для OlmerDale Найти все сообщения от OlmerDale
  № 12  
Ответить с цитированием
OlmerDale
[+1 09.05.15]

Регистрация: Jan 2015
Сообщений: 113
Значит я опять не смог донести мысль...
Класс, который должен быть унаследован или реализовывать поведение ноды,
он не из нативных. Этот класс собираю я и к DO он вообще никакого отношения не имеет
и к нативным "абстрактным классам" тоже ( и я знаю что в as3 нет абстрактных классов, а
от якобы существующих наследоваться нельзя ). Со Sprite я его сравнил только по тому,
что спрайт является и контейнером и так же может быть чилдом самого себя. А ещё
спрайт является "законченным классом", имеется ввиду, что мне достаточно создать его
инстенс, а второй уже добавлять в него. Не придется использовать что-то ещё, типа -
Код AS3:
var sp1:Sprite = new Sprite();
var sp2:Sprite = new Sprite();
StaticClassIsertSprite.insert(sp1, sp2);

И исходя из всего этого сложность у меня только в согласовании его архитектуры с ооп.
Если бы мне сказали, что такая конструкция не нарушает ооп, то я бы сделал. А у самого
знаний не хватает поставить точку в спорах можно-неможно. Или я опять непонятно объяснил?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Нет. Мне не понятно.
Ну создали Вы класс со свойствами next, prev, up и down. И наследуете его как хотите. В чем проблема? Как он "нарушает ООП"?

Люди, которые делали поле data:*, подразумевали отдельную структуру классов, обеспечивающих дерево — отдельно от всех остальных классов. Это структура "контейнеров", или "представителей". Они играют в свое дерево, и каждый "представляет" какой-то объект. Преимущество здесь в том, что объектом может быть действительно любой объект, никогда в жизни не слышавший ни о каких деревьях и нодах. Это, скажем так, соответствует композиции а не наследованию.
То, что делаете Вы — через наследование. Нодой может быть любой класс, если он наследует класс Node. Преимущество — отсутствие отдельно организованного Дерева как набора экземпляров нод, которое нужно обслуживать. Ну, вобщем-то, это ваше инвазивное дерево тоже надо обслуживать. Но не создается лишних объектов, согласен.
А, вот еще нюанс: в первом способе один и тот же объект может иметь несколько разных представителей.
__________________
Reality.getBounds(this);

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
не уверен что правильно понял что вы хотите

Код AS3:
package
{
	public class Node
	{	
		public var data:*;
 
		public function Node()
		{
		}
 
		public function get prev():Node {
			return _prev;
		}
 
		public function set prev(node:Node):void {
			if (!_prev) _prev = node;
		}
 
		public function add( node:Node ):void {
			next = node;
			node.prev = this;
		}
 
		public function set next(node:Node):void {
			_next = node;
		}
 
		public function get next():Node {
			return _next;
		}
 
		private var _prev:Node;
		private var _next:Node;
	}
}
Код AS3:
package
{
	public class CustomClass extends Node
	{
		public function CustomClass()
		{
 
		}
	}
}
Код AS3:
package
{
	import flash.display.Sprite;
 
	public class TestNode extends Sprite
	{
		public function TestNode()
		{
			var custom:CustomClass = new CustomClass();
			custom.data = 'parent';
 
			var node:Node = new Node();
			node.data = 'child';
 
			var childnode:Node = new Node();
			childnode.data = 'childnode';
 
			node.add( childnode);
			custom.add( node );
 
			trace(">>> Who is the youngest ? \n");
			elevator(custom,false);
 
			trace(">>> Who is the senior ? \n");
			elevator(childnode,true);
 
		}
 
		private function elevator(node:Node, goUp:Boolean):void {
 
			var level:uint = 0;
 
			while( node ) {
 
				trace('Level '+level++);
 
				xray( node );
 
				node = goUp ? node.prev : node.next;
			}
		}
 
		private function xray(node:Node):void {
 
			if (node.prev) trace(' Prev node: '+ node.prev.data );
 
			trace(' This node: ' + node.data );
 
			if (node.next) trace(' Next node: '+ node.next.data );
 
			trace("\n");
		}
	}
}
Цитата:
>>> Who is the youngest ?

Level 0
This node: parent
Next node: child


Level 1
Prev node: parent
This node: child
Next node: childnode


Level 2
Prev node: child
This node: childnode


>>> Who is the senior ?

Level 0
Prev node: child
This node: childnode


Level 1
Prev node: parent
This node: child
Next node: childnode


Level 2
This node: parent
Next node: child
__________________
return this...


Последний раз редактировалось AlexCooper; 22.03.2015 в 08:13.
Старый 22.03.2015, 20:55
OlmerDale вне форума Посмотреть профиль Отправить личное сообщение для OlmerDale Найти все сообщения от OlmerDale
  № 15  
Ответить с цитированием
OlmerDale
[+1 09.05.15]

Регистрация: Jan 2015
Сообщений: 113
Код AS3:
package
	// если объяснять на Вашем примере,
	// то CustomClass становится CustomContainerClass
	public class CustomContainerClass extends Node
	{
		// а так как он контейнер он содержит лист объектов
		// унаследованных от Node. Но это не привычный и 
		// лист, который содержит ноды, в которые добавляется
		// все что туда положат, а это лист принимающий и манипулирующий
		// самими нодами.
		private var _nodeQueueList:NodeQueueList;
 
		public function CustomContainerClass()
		{
 
		}
 
		// и так как это контайнер, то CustomContainerClass
		// имеет метод insert
		public function inser(node:Node):void
		{
			// и тут уже добавляем в _nodeQueueList
		}
 
	}
}
Но меня напугало слово "инвазивно" и я отказался от первоначальной идеи
и заменил
Код AS3:
private var _nodeQueueList:NodeQueueList;
Код AS3:
private var _nodeQueueList:Vector.<Node>;
Спасибо всем.

Старый 22.03.2015, 22:31
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 16  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну и зачем Вы упорно используете Очередь (Queue)?
Для дерева любая нода должна иметь ссылку на parent:Node и список children:Vector<Node>. То есть как в уже цитировавшемся Вами Sprite. И даже возможно те же методы придется подшить, типа getChildByName() и getChildAt(). Это нарушает ООП? Пожалуйтесь в ООН.
__________________
Reality.getBounds(this);

Старый 22.03.2015, 23:50
OlmerDale вне форума Посмотреть профиль Отправить личное сообщение для OlmerDale Найти все сообщения от OlmerDale
  № 17  
Ответить с цитированием
OlmerDale
[+1 09.05.15]

Регистрация: Jan 2015
Сообщений: 113
Я опять ошибся в объяснениях, сорри. Я вообще отказался от идеи с нодами и перешел на идею где
контайнер и его чилды унаследованы от общего абстрактного класса ( в последнем ошибочном примере
я его Node назвал ). да и очередь у меня приоритетная которую класс-контайнер запускает при добавлении в него объекта унаследованного от абстрактного типа, от которого унаследован и он.

А в случаи, когда при изменении дочернего... того, что вчера я называл узлом... должны произойти изменения в родительском, я посылаю событие. И родительский объект начинает рекурсивно обходить своих детей и в случаи если чилд тоже контайнер, то он у него через, Вами упомянутые методы, их получает и идет дальше.

А Вы случаем не знаете для чего дисплей обжектам нужна ссылка на парент?

Старый 22.03.2015, 23:56
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 18  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну, потому что DisplayList задуман и реализован как Дерево.
В конце концов, это просто удобно, когда можно вызвать родителей к директору.
__________________
Reality.getBounds(this);

Старый 23.03.2015, 21:14
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 19  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от OlmerDale Посмотреть сообщение
Могут ли деревья состоять из узлов-листьев не класса контейнера с полем data:*, а из самих-поведенчески законченных классов-объектов?
Если "поведенчески законченные" объекты будут выглядеть как узлы, то чем их структура будет отличаться от древовидной? Если же нет, то как они смогут образовать древовидную структуру?
Тут простой философский вопрос: перед нами дерево или не дерево?

Цитата:
То есть я объект CustomInstance и у меня есть ссылку на next, prew, up, down.
У дерева примерно такие ссылки и есть.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

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

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


 


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


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