Неопределенные свойства при реализации интерфейса - PullRequest
0 голосов
/ 02 августа 2011

Вот моя подпись класса:

public class YouTubeControls extends Controls implements IControls

YouTubeControls имеет общедоступную переменную foo.Этот код:

 var controls:IControls = new YouTubeControls();  
 trace(controls.foo);

приводит к этой ошибке:

Доступ к неопределенному свойству foo через ссылку со статическим типом IControls.

В моем приложении будут другие классы "Control", поэтому приведение элементов управления (YouTubeControls(controls)) не будет работать.Как я могу получить доступ к controls.foo?

Редактировать
Если я не могу сделать это без приведения, как мне решить проблему необходимости знать, к какому классу привести его как

Ответы [ 4 ]

1 голос
/ 02 августа 2011

trace(controls.foo); - это то же самое, что и вызов IControl(controls).foo, поскольку переменная вашего элемента управления объявлена ​​типа IControlПроблема в том, что вы не дали интерфейсу IControl функцию получения foo.Обратите внимание, что свойства не допускаются в интерфейсах, только методы.Смотрите другие ответы здесь.

1 голос
/ 02 августа 2011

В данный момент у меня нет доступа к Flash Builder, но я считаю, что вы должны иметь возможность использовать оператор «as», чтобы проверить, является ли объект тем или иным классом.

if ((controls as YouTubeControls) != null) //controls IS a YouTubeControls 
                                           //because it didn't return null
    trace((controls as YouTubeControls).foo);
else
    ...

Преимущество оператора as заключается в том, что он пытается выполнить приведение, но в случае неудачи возвращает нулевое значение, тогда как другая форма приведения ...

YouTubeControls(controls)

Будет вызывать исключение времени выполнения, если элементы управлениянельзя кастовать как YouTubeControls.

1 голос
/ 02 августа 2011

Если у вас есть несколько IControls, вы можете расширить этот интерфейс.

    public interface IMyControl extends IControl
    {
        public function get foo():SomeType;
    }

И затем

    public class YouTubeControls extends Controls implements IMyControl

в каждом классе управления.

1 голос
/ 02 августа 2011

Если foo определено в YouTubeControls, вы не сможете получить к нему доступ через ссылку на IControls. Если вы измените свой код на это, он будет работать:

var ytControls:YouTubeControls = new YouTubeControls();
trace(ytControls.foo);
var controls:IControls = ytControls;

Однако вы упомянули, что другие элементы управления также могут иметь свойство foo; в таком случае вы должны определить это свойство в IControls, а не YouTubeControls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...