Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Найти ближайшего общего предка (http://www.flasher.ru/forum/showthread.php?t=215781)

Appleman 10.09.2020 22:50

Найти ближайшего общего предка
 
Всем привет!

Столкнулся с проблемой. Имею несколько экземпляров (пусть для примера из будет 2) - наследников одного общего класса. При этом они могут принадлежать к одному классу-наследнику, а могут к разным. Как найти их ближайшего общего предка, если цепочка наследования включает 3-4 уровня?

Головой понимаю, что задача элементарная, но вот как написать, не могу сообразить.

СлаваRa 21.09.2020 21:35

getQualifiedSuperclassName

describeType

Appleman 25.09.2020 03:00

Спасибо.
Вот такое решение по итогу получилось. Работает.

Код AS3:

public static function getNearestSharedAncestor (heirs: Array, TopClass: Class) : String
                // Ищет и возвращает имя ближайшего общего класса полученных наследников
                {
                        var tree: Dictionary = new Dictionary();
 
                        if (!heirs.length) return null;
 
                        for each (var heir: * in heirs)
                        {
                                if (!(heir is TopClass)) throw (CLASS_DEBUG_NAME + "-> getNearestSharedAncestor: полученные наследники не принадлежат общему классу " + getQualifiedClassName (TopClass));
                                if (getDefinitionByName (getQualifiedClassName (heir)) == TopClass) return getQualifiedClassName (heir);
 
                                var HeirClass: Object = getDefinitionByName (getQualifiedClassName (heir));
                                var heritageChain: Vector.<String> = new Vector.<String>;
 
                                while (HeirClass != TopClass)
                                {
                                        heritageChain.push (getQualifiedClassName (HeirClass));
                                        HeirClass = getDefinitionByName (getQualifiedSuperclassName (HeirClass))
                                }
                                heritageChain.push (getQualifiedClassName (HeirClass));
 
                                tree[heir] = heritageChain;
                        }
 
                        var minLength: uint = tree[heirs[0]].length;
 
                        for each (heir in heirs) if (tree[heir].length < minLength) minLength = tree[heir].length;
 
                        for each (heir in heirs)
                        {
                                while (tree[heir].length > minLength)
                                {
                                        tree[heir].shift();
                                }
                        }
 
                        var result: String;
 
                        while (!result)
                        {
                                if (toCut) for each (heir in heirs) tree[heir].shift();
 
                                var item2test: String = tree[heirs[0]][0];
                                var toCut: Boolean = false;
 
                                for each (heir in heirs) if (tree[heir][0] != item2test) toCut = true;
 
                                if (!toCut) result = item2test;
                        }
 
                        return (result);
                }


СлаваRa 27.09.2020 21:54

скобка и так экранирует "слово" от чего-либо, зачем еще скобку экранировать пробелом непонятно ;( чем меньше в коде лишнего(пробелов, скобок и т.д.) тем проще его читать и понимать ;)

Appleman 30.09.2020 10:11

Объясни, пожалуйста. В каком месте?

СлаваRa 02.10.2020 21:05

Код:

getNearestSharedAncestor (
Код:

getDefinitionByName (getQualifiedSuperclassName (HeirClass))
но
Код:

.shift();
Код:

tree[heir]
Код:

new Vector.<String>;
- тут не хватает скобок

Код:

throw (CLASS_DEBUG_NAME + "-> getNearestSharedAncestor: полученные наследники не принадлежат общему классу " + getQualifiedClassName (TopClass));
- throw строки вместо ошибки

Код:

TopClass: Class) : String
- разная стилистика :

Код:

var tree: Dictionary = new Dictionary();
if (!heirs.length) return null;

- наверное имеет смысл создавать словарь только если if не отработал

Добавлено через 1 минуту
Цитата:

for each (heir in heirs) if (tree[heir][0] != item2test) toCut = true;
if (!toCut) result = item2test;
Уже после первого присвоения toCut = true; следующий if не выполнится, соотвественно не имеет смысла гонять цикл после этого присвоения

Добавлено через 4 минуты
Код:

if (toCut) for each (heir in heirs) tree[heir].shift();
var item2test: String = tree[heirs[0]][0];
var toCut: Boolean = false;

сначала проверяем переменную toCut и только потом декларируем ее

Appleman 02.10.2020 23:35

Большое спасибо. Всё принял к сведению.


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

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