Спасибо.
Вот такое решение по итогу получилось. Работает.
Код 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);
}