Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Множественное наследование (http://www.flasher.ru/forum/showthread.php?t=141194)

Arust 18.06.2010 12:52

Множественное наследование
 
Использую BLAZEDS для связи с java WEB приложением.
На java есть классы:
Код:

public class BasicObject implements Serializable {
protected long id;
        protected BasicObject parent;
        protected String name;
....
}


public class ElDocument extends BasicObject {
...
}

Создаю сервис, например, с методом получения списка объектов BasicObject:
Код:

public List<BasicObject> getObjects() {
  List res = new ArrayList();
  res.add(new ElDocument(...));
  return res;
}

С точки зрения ООП все должно работать красиво: есть список базового типа с различными экземплярами. Но при создании службы во FLEX, с помощью Flex Builder, такого эффекта не наблюдается. При вызове соответствующего метода во FLEX происходит ошибка преобразования типа
ElDocument в тип BasicObject, при этом часть полей из ElDocument обнуляются.

Как решить такую проблему, используя общепринятые подходы ООП? При попытке во FLEX множественно унаследовать ElDocument от BasicObject выдается ошибка.

wvxvw 18.06.2010 17:40

Не использовать DCD, оно просто плохо работает, и от него больше головной боли, чем толку.
В вашем примере в упор не могу разглядеть множественное наследование... где оно? В AS3 поддерживается только множественное наследование у интерфейсов, у классов его нет. В принципе ваш пример должен работать, ну, на вид, нет в нем ничего такого, что бы помешало. То же самое нормально работает в PHP например.

Dimitry_II 19.06.2010 03:05

Да, вроде все слаженно. Хотя можно посмотреть на модель объектов во Flex'е.
Кстати, между идентефикатором управления доступом protected в Java и AS3 есть небольшие различия. Маловероятно, но все-таки можно допустить, что это могло привести к несоответствиям.

Котяра 19.06.2010 12:00

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

alexberkut 25.06.2010 14:21

Я так понял что на флексе у тебя есть 2 класса:
BasicObject
и
ElDocument extends BasicObject

На яве у тебя тоже должно быть 2 класса:
BasicObject
и
ElDocument extends BasicObject

притом оба класса на флексе должны быть pарегестрированны:
registerClassAlias("BasicObject", "BasicObject");
registerClassAlias("ElDocument", "ElDocument");
или через [RemoteClass], но это работает не всегда.

если же ты замапил 1 ява класс на два флексовых, то будет такой эффект.

Если же ты на флексе зарегистрировал 1 класс BasicObject и с явы пытаешь послать ElDocument, который на яве наследуется от BasicObject. То на флексе тебе прилетит не то, ибо флекс сериализует/десериализует один к одному (по мапе) и про наследование он ничего не знает и знать не будет.

ЗЫ: Множественное наследование - это когда класс наследуется от нескольких классов-родителей. Скажем:
ElDocument extends BasicObject, SecondObject.
Такое в яве и флексе не поддерживается

Arust 05.07.2010 13:31

Прошу прощения что сразу подробно не описал:
на яве есть 2 класса
Код:

public class BasicObject implements Serializable {
....
}
public class ElDocument extends BasicObject {
...
}

На флексе автоматом (в среде Flash Builder) генерируется классы:
Код:

[ExcludeClass]
public class _Super_BasicObject extends flash.events.EventDispatcher implements com.adobe.fiber.valueobjects.IValueObject
{
    model_internal static function initRemoteClassAliasSingle(cz:Class) : void
    {
        try
        {
            if (flash.net.getClassByAlias("BasicObject") == null)
            {
                flash.net.registerClassAlias("BasicObject", cz);
            }
        }
        catch (e:Error)
        {
            flash.net.registerClassAlias("BasicObject", cz);
        }
    } 
       
...

Код:

[ExcludeClass]
public class _Super_ElDocument extends flash.events.EventDispatcher implements com.adobe.fiber.valueobjects.IValueObject
{
    model_internal static function initRemoteClassAliasSingle(cz:Class) : void
    {
        try
        {
            if (flash.net.getClassByAlias("ElDocument") == null)
            {
                flash.net.registerClassAlias("ElDocument", cz);
            }
        }
        catch (e:Error)
        {
            flash.net.registerClassAlias("ElDocument", cz);
        }
    }
...

ошибка множественного наследования в том что ElDocument уже расширяет EventDispatcher, а попытка унаследовать и от BasicObject остается безуспешной.
Поля серриализуемых объектов все публичные. Если нельзя так, то какое есть красивое решение? Неужели для каждого типа объекта надо создавать свой метод?

alexberkut 05.07.2010 13:37

А зачем такие хитрые манипуляции:
проверить если алиаса для класса нету то зарегистрировать, если упала ошибка, то зарегистрировать... Ещё и лишные классы заводить какие-то... зачем?

пиши просто сразу:
Код:

registerClassAlias("BasicObject", "BasicObject");
registerClassAlias("ElDocument", "ElDocument");

А классы сам руками создай:
Код:

BasicObject extends EventDispatcher
Код:

ElDocument extends BasicObject

wvxvw 05.07.2010 16:51

alexberkut
Эти "хитрые манипуляции" генерит флексовый компилятор, ввиду большого ума разработчиков. Я даже постил багу, чтобы поправили, меня не поняли и сказали, что фиксить не будут, т.как не понимают в чем глупость в коде... вот так вот.

alexberkut 05.07.2010 17:15

Ещё один повод руками писать классы, а не пользоваться всякими рукозаменителями.


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

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