![]() |
Интерфейс и его имплементация
Вопрос по книге Сандерса о паттернах проектирования в AS3 (Купил вчера в PDF в прекрасном качестве, весь код можно копипастить, если кому надо книжку, с радостью поделюсь). Авторы пишут о предпочтении "программирования от интерфейса (супертипа), а не его имплементации". В качестве примера приводится то, что в моей программе выглядело бы вот так:
Код AS3:
И что вообще уважаемые знатоки думают о таком подходе? |
ты сразу ограничиваешь функционал своего героя суперклассом Character, теряя всю специфику Hero
|
Цитата:
|
Цитата:
Код AS3:
|
Цитата:
Ты объявил переменную как Character. Абсолютно неважно, что ты туда запихаешь в рантайме. Компилятор видит, что ты пытаешься вызвать несуществующий метод именно у Character. Это тип переменной, и он не зависит от того, какой конкретно объект туда записан. |
Цитата:
|
часто так пишут в сигнатурах методов, а не при объявлении переменных.
Код AS3:
|
Я не понимаю этого вопроса.
Ну вот у тебя допустим объявлена переменная типа Спрайт. Ты можешь туда любую кнопку запихать. Но если ты в коде обратишься к этой переменной не как к Спрайту, а как к кнопке, то получишь ошибку компиляции? Конечно получишь, потому что у Спрайта нет таких свойств которые ты добавил в кнопку-наследника. Для компилятора это Спрайт! Потому что переменная имеет тип Спрайт. И компилятору не надо дожидаться рантайма чтобы указать тебе на ошибку: ты вызываешь свойства и методы, которых нет у данного типа. Если хочешь обращаться к свойствам и методам кнопки, укажи что это кнопка и проблем не будет. Что тут нелогичного? |
Как будто это я придумал :)
Вот смотрите из книги по шаблонам проектирования, буквально первая глава: Код AS3:
|
И? Класс Rock же не создал новый метод, которого нет в Polymorphism. Он переопределил суперметод. В этом и заключается полиморфизм. А вопрос то в чем?)
Переменная rock имеет тип Polymorphism. У типа Polymorphism есть метод myMusic(). У переменной rock вызывается метод myMusic(), который есть у ее типа. Где тут компилятору кричать "Караул!"? |
Всё. Я опять похоже "запоролся". Вся эта конструкция работает при условии, что у наследников нет никакой "отсебятины" и они только переопределяют методы супера. Так?
|
Ну да, так.
Как только пошла отсебятина — надо приводить к нужному конкретному классу, у которого эта отсебятина. Добавлено через 18 минут То есть если ты создашь у класса Rock кастомный метод playDoors(), то не сможешь вызвать его у переменной rock:Polymorphism. Тебе придется кастовать ее к типу Rock, у которого есть этот метод: Код AS3:
Однако, если в переменной rock на этот момент окажется не экземпляр класса Rock, то будет ошибка уже в runtime, потому что кастинг вернет null, у которого нет метода playDoors(). Поэтому придется всю конструкцию зашить еще и в проверку: Код AS3:
|
Appleman, тебе просто нужно по-больше опыта наработать, чтобы всё понять. Со временем понимание таких штук записывается просто на уровень ДНК)) Когда сразу много информации попадает в голову, она просто превращается в кашу. Пиши игры, приложения, не забрасывай это дело и тогда точно всё поймёшь
|
| Часовой пояс GMT +4, время: 07:45. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.