Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Каст интерфейса не проходит если тип возвращаемый функцией является супеклассом (http://www.flasher.ru/forum/showthread.php?t=117421)

wvxvw 27.10.2008 18:21

Каст интерфейса не проходит если тип возвращаемый функцией является супеклассом
 
ОК, сейчас попробую объяснить...
Дано:
суперкласс: Form
наследники: TextForm, VideoForm и т.д.
есть интерфейс, который имплементит часть наследников: IExtendedForm
есть функция типа getTopmostForm():Form
я не могу сделать ее getTopmostForm():IExtendedForm потому, что не все наследники Form имплементят IExtendedForm. Но, когда я пытаюсь сделать:
IExtendedForm(getTopmostForm()), то получаю null -- и это очень обидно, принимая во внимание, что объект, который возвращает функция точно имплементит этот интерфейс =)
Это даже скорее не вопрос... похоже, что ничего с этим не поделаешь, и так реализованы интерфейсы. Просто, если вдруг кто-то столкнется...

Волгоградец 27.10.2008 19:32

Не знаю. У меня возвращает [object Object], если класс реализует интерфейс и null, если не реализует.

wvxvw 27.10.2008 19:56

Ну, не знаю... может это связано с тем, что суперкласс имплементит другой интерфейс... =/

etc 27.10.2008 20:11

getTopmostForm должен возвращать IForm, а IExtendedForm должен наследовать IForm .

wvxvw 28.10.2008 16:58

А что, в AS2 нельзя имплементить больше чем 1 интерфейс? вроде ж как можно... Т.е. мне совсем не нужно чтобы IExtendedForm наследовался от IForm... более того, может быть ситуация, когда его имплементит, скажем FormItem который вообще не связан с Form...
T.e. схема:
Код:

Form                                FormItem
[implements IForm]        [implements IFormItem]
|                                [implements IExtendedForm]
TextForm                       
[implements IForm, IExtendedForm]

FormManager.getTopmostForm():IForm
// иногда может вернуть и TextForm
// в таком случае я хочу его перекастовать в IExtendedForm

formInstane.getItem(....):IFormItem
// но иногда я могу другим способом получить объект,
// который обладает тем же функционалом.
и могу его перекастовать в
IExtendedForm(formInstane.getItem(....)).getProxy()

// сам интерфейс:
interface IExtendedForm
{
        function getProxy():Proxy
}

// т.е. я знаю, что я могу вызвать следующие методы
// потому как оба класса имплементят нужный интерфейс
formItem.getProxy():Proxy
textForm.getProxy():Proxy

// но так я не могу, потому что getProxy() есть не у всех
// классов наследующихся от Form
form.getProxy():Proxy



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

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