PDA

Просмотр полной версии : Как вызвать свой метод не приводя к типу


mechman
03.03.2011, 07:34
Здравствуйте, коллеги по цеху!

Есть менеджер объектов. На вход ему подаётся ссылка на объект.
Подаваемые объекты экземпляры разных классов, но в любом случае эти классы расширяют (extends) Sprite.

Менеджер должен в каждом объекте в процессе работы с ним запускать метод.
Делаю так: currentPage.setPause(true);
(currentPage - ссылка на объект).

Но конечно ругается FlashDevelop:
Error: Call to a possibly undefined method setPause through a reference with static type flash.display:DisplayObject.

Всегда в таком случае привожу к типу: (currentPage as SimplePage).setPause(true);
Но в этом случае объект может быть нескольких типов.

Уважаемые, подскажите изящное решение. Нет желания огород городить.

alatar
03.03.2011, 08:27
Всегда в таком случае привожу к типу: (currentPage as SimplePage).setPause(true);
Но в этом случае объект может быть нескольких типов.
Нормальный способ: Сделайте им общий интерфейс, например IPausable c с единственным методом setPause(true) (вместо этого метода лучше воспользоваться сеттером/геттером) и приводите к интерфейсу.
Плохой способ. Приводите к Object, ругаться перестанет.

mechman
03.03.2011, 09:24
Точно. Освоился с интерфейсами, но ошибка осталась.
Вот код интерфейса:
package pages
{
public interface IPausable
{
function setPause (p:Boolean) :void;
}
}
Но FlashDevelop всё равно ругается на строчку:
_tempNewPage.setPause(true);
Подскажите, пожалуйста, что не так?

cleptoman
03.03.2011, 09:32
а в классах указали, что они реализуют этот интерфейс?

mechman
03.03.2011, 09:42
Да.
public class GameLevelX extends Sprite implements IPausable{

cleptoman
03.03.2011, 09:47
(_tempNewPage as IPausable).setPause(true);

mechman
03.03.2011, 09:52
В точку!
Заработало )
Благодарю!

in4core
03.03.2011, 13:45
@cleptoman а вот поясните с фигали приводить к типу если implements все же сделал? поидее и без типа должно работать! странно

cleptoman
03.03.2011, 13:59
а с фигали он все сделал, если _tempNewPage был объявлен как другой тип?

mechman
04.03.2011, 01:52
@cleptoman а вот поясните с фигали приводить к типу если implements все же сделал? поидее и без типа должно работать!
Ошибка вываливается на этапе компиляции. Я так понял - компилятор, если не привести к типу, не знает есть ли метод setPause в указанном объекте. Поэтому и ругается.

in4core
04.03.2011, 04:05
Извините, я подумал что реализация идет в классе, а так конечно тип требуется.

Psycho Tiger
04.03.2011, 15:20
Извините, я подумал что реализация идет в классе, а так конечно тип требуется.
А при реализации в классе он не потребуется? Как можно реализовать интерфейс вне класса?