PDA

Просмотр полной версии : Множественное наследование


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
Эти "хитрые манипуляции" (http://govnokod.ru/2386) генерит флексовый компилятор, ввиду большого ума разработчиков. Я даже постил багу, чтобы поправили, меня не поняли и сказали, что фиксить не будут, т.как не понимают в чем глупость в коде... вот так вот.

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