Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ООП. Интерфейсы (http://www.flasher.ru/forum/showthread.php?t=170912)

Welcometo 04.11.2011 19:34

ООП. Интерфейсы
 
Если класс Figure реализовывает несколько интерфейсов: IMoveable, IDragable, ICleanable
то при вот таком объявлении перемнной
Код:

IMoveable fig1 = new Figure();
будут ли доступны у этого объекта методы из IDragable и ICleanable?

Wolsh 04.11.2011 19:47

у объекта будут. У переменной fig1 – нет. Надо создать переменные типа IDragable, ICleanable, либо кастовать fig1 к этим типам данных.
Код AS3:

(fig1 as ICleanable).clean();


Welcometo 04.11.2011 19:51

спасибо, все понятно

goodguy 04.11.2011 19:53

Цитата:

IMoveable fig1 = new Figure();
Такое объявление приведет к ошибке. Это же не джава.
Код AS3:

var fig1:IMoveable = new Figure();


carrotoff 04.11.2011 22:18

Цитата:

IMoveable fig1 = new Figure();
я, кстати, даже немного залип, подумал что шарп:)

expl 05.11.2011 01:43

Если есть несколько объектов, которые надо обрабатывать одновременно и как IMoveable и как IDragable и как ICleanable, то лучше для них еще один интерфейс сделать и заставить его реализовывать
Код AS3:

public interface IMoveDragCleanable extends IMovable, IDragable, IClenable {}

Потому что иначе, при передаче в метод, который использует все 3 интерфейса возникнут вопросы, а какой из них передавать? и что приводить внутри типы?
Код AS3:

public function process(item:IDragable...и еще должен быть IMovable, ...?
public function process(item:IMoveDragCleanable):void// Так явно понятнее

Но это, конечно, если тройка интерфесов IMovable, IDragable, IClenable встречается стабильно,
а если для разных функций нужны произвольные комбинации интерфейсов - на комбинаторный взрыв числа отнаследованных интерфейсов можно напороться.

-De- 05.11.2011 01:50

Вообще для случая, когда "класс Figure реализовывает несколько интерфейсов: IMoveable, IDragable, ICleanable " напрашивается композиция.

Welcometo 05.11.2011 15:48

Цитата:

Если есть несколько объектов, которые надо обрабатывать одновременно и как IMoveable и как IDragable и как ICleanable, то лучше для них еще один интерфейс сделать и заставить его реализовывать
А если написать так
Код:

Figure fig1 = new Figure()
разве не будут доступны все методы интерфейсов?

Wolsh 05.11.2011 16:10

Почему же, будут. Только зачем тогда вообще интерфейсы, если нет полиморфизма и класс один-одинешенек?))

Dukobpa3 05.11.2011 16:11

Цитата:

разве не будут доступны все методы интерфейсов?
Код AS3:

var fig1:Figure  = new Figure()

- Так будут доступны все методы интерфейсов. Но это слегка отличается от первоначального вопроса.

Ты вроде спрашивал будут ли они доступны в виде:
Код AS3:

var fig1:IDragable= new Figure()

Так вот методы из IDragable будут доступны в данном случае, и все остальные тоже, но компилятору придется явно указывать что fig1 оказывается еще и IMoveable и ICleanable. Как написал Wolsh в первом же ответе.

Но только тогда непонятно зачем это нужно вообще? Если все три интерфейса будут использоваться в одном месте то смысла объявлять переменную с типом одного из интерфейсов смысла нет, проще сделать эту переменную сразу с типом класса реализовываюющим эти интерфейсы. Интерфейсы нужны там где в определенном месте тебе нужны только методы из этого интерфейса. Например функция драга, в каком-то глобальном классе, ей пофигу что драгать, и в качестве параметра она принимает IDragable. В таком случае ты используешь класс как тебе надо, а в функцию его передаешь как кучу других.

Яркий пример это BitmapData#draw (и еще много других, это просто на языке крутится) - он принимает IBitmapDrawable и ему глубоко пофигу может ли принятый им объект что-то кроме того что описано в интерфейсе.

Ну т.е. если такого разделения не нужно то собственно и смысл интерйесов слегка нивелируется. Делай обычный класс и не парь никому моск.

Если же у тебя есть отдельный модель который работает с драгами, отдельный с клинами, отдельный с мувами - то да, делай интерфейсы но тогда и вопросы отпадают на тему доступа к остальному функционалу класса не описанному в каждом конкретном интерфейсе.

Как еще один метод использования интерфейсов это просто к примеру большая команда, есть совсем зеленые, и вот чтоб совсем зеленые или же просто новый человек не напихал отсебятины пишутся интерфейсы. Мол пиши внутри что хочешь, но вот этот набор методов должен быть и быть должен в таком вот виде. Но такой подход я лично встречал не так часто. Команда у нас небольшая и надобности не возникало.

Добавлено через 3 минуты
Цитата:

Почему же, будут. Только зачем тогда вообще интерфейсы, если нет полиморфизма и класс один-одинешенек?))
Ну то же самое и я сказал только развернуто:))

Получи ТС два ответа по цене одного ;)


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

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