|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+1 09.05.15]
Регистрация: Jan 2015
Сообщений: 113
|
Деревья в программировании
Возможно flash-программисты смогут мне ответить, так как в местах где я уже спрашивал, мне не смогли дать однозначный ответ.
Могут ли деревья состоять из узлов-листьев не класса контейнера с полем data:*, а из самих-поведенчески законченных классов-объектов? То есть я объект CustomInstance и у меня есть ссылку на next, prew, up, down. Если Вы видели прецеденты подобного, то можете на словах рассказать что это было. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Другими словами, "как в любой уже сформированный класс, не имеющий полей next:*, prew:*, up:*, down:* добавить эти поля динамически". Да никак.
__________________
Reality.getBounds(this); |
|
|||||
[+1 09.05.15]
Регистрация: Jan 2015
Сообщений: 113
|
Цитата:
Но если строить по принципу, когда нужный объект просто передается в создаваемую ноду и присваивается её полю, то получившийся механиз вызывает те же проблемы, которые и привели мысли к созданию деревьев из данных. Но вот если бы сам объект был и законченным объектом и нодой одновременно и это бы не противоречило ООП, то это было тем, о чем я и спрашиваю. Я знаю только очень простые случаи, типа - package { public class Node { public var next:Node; public var prev:Node; public var data:*; public function Node() { } } } package recursive { public class CustomClass { public function CustomClass() { // это класс можно сравнить по своей важности // например со Sprite } } } package { public class Main { public function Main() { var node:Node = new Node(); node.data = new CustomClass(); } } } package recursive { public class CustomClass { public var next:Node; public var prev:Node; public function CustomClass() { // это класс можно сравнить по своей важности // например со Sprite } } } package recursive { public class Main { public function Main() { var node:CustomClass = new CustomClass(); } } } |
|
|||||
Зачем ему быть и тем и тем, какую практическую задачу вы решаете?
__________________
местонахождение |
|
|||||
[+1 09.05.15]
Регистрация: Jan 2015
Сообщений: 113
|
Вот взять для примера Sprite. Он узел-контейнер. В него можно добавить несколько спрайтов, а потом его с его детьми добавить в другой. Все спрайты имеют ссылку на родителя.
То что я делаю немного похоже на спрайт. Я делаю контейнер, который реализует интерфейс INode ( его можно сравнить с абстракцией DisplayObject ) который добавляет в себя такие же контейнеры и объекты которые не могут быть контейнерами, но тоже реализуют INode. Это нечто - package recursive { public class INode { public function INode() { function next():INode function prev():INode } } } // АБСТРАКТНЫЙ КЛАСС implements INode package recursive { public class AbstractClass implements INode { public function AbstractClass() { } } } package recursive { public class SomeCustomClass extends AbstractClass { public function SomeCustomClass() { // это класс можно сравнить по своей важности // например со Sprite } } } package recursive { public class CustomClass extends AbstractClass { public var nodes:INode public function CustomClass() { // это класс можно сравнить по своей важности // например со Sprite } public function setNode(node:INode):void { this.nodes.next = node; } } } Но в DOC, как мне кажется, все чилды хранятся, хоть и в V<DO>, хоть и типизированном, но все же массиве, который сам состоит из нод. А у меня получается и DO и ещё и нода. Если я не найду доказывающего, что это не нарушит ООР, то и делать так не буду. Расчитываю на Вашу помощь. |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
какие проблемы у этого подхода?
|
|
|||||
Да никаких, Genome2D построен по такомо принципу. Но вы так и не ответили на вопрос "зачем?" вы это делаете.
__________________
местонахождение |
|
|||||
[+1 09.05.15]
Регистрация: Jan 2015
Сообщений: 113
|
Пока повременю с ответом и мысли в кучу соберу.
|
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
На всякий случай напишу, что я не OlmerDale.
|
|
|||||
[+1 09.05.15]
Регистрация: Jan 2015
Сообщений: 113
|
Цитата:
Если тоже самое создавать с нодами, в которые передавать классы в качестве значения свойства, то я в этом просто не вижу смысла, так как массив ДАЖЕ быстрее ( он только по удалению выигрывает, но этот выигрыш меркнет на фоне остальных проигрышей ). И я немного не понял, Вы имели ввиду что genom создан по тому принципу, который хочу сделать я? Или по тому, который мне не нравится? Я просто сейчас посмотрел его доки ( сорсы не смог найти на as3 ) и там у самого базового класса есть lastChild:GNode и nextNode:GNode... Это говорит о том, что базовый класс является и нодой и базовым ДО? Добавлено через 3 часа 46 минут Цитата:
package { public class AbstractClass implements INode { public var next:INode; public var prev:INode; public function AbstractClass() { } } } package { public class CustomClass extends AbstractClass { protected var _nodes:NodeList; public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public var someProp:Type; // какое-то свойство public function CustomClass() { // а в теле этого класса я реализую методы // которые будут инкапсулировать связь между // someProp } public function insert(target:INode):void { this._nodes.insert(target); } } } расширяющих AbstractClass, в том числе и собственного типа. то есть я могу сделать группу-групп. А NodeList не содержит узлов, узлы это потомки AbstractClass, которыми он только управляет. Вот так я хотел сделать и на то есть причины. Но как я понял, так делать нельзя. Хотя так почему-то сделал автор genom2d, а ещё я то же самое в анимации tweenmax нашел, в классе Animation есть ссылки на next:Animation prev:Animation, что не меняет ооп. |
Часовой пояс GMT +4, время: 22:24. |
|
« Предыдущая тема | Следующая тема » |
|
|