|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Интерфейс и его имплементация
Вопрос по книге Сандерса о паттернах проектирования в AS3 (Купил вчера в PDF в прекрасном качестве, весь код можно копипастить, если кому надо книжку, с радостью поделюсь). Авторы пишут о предпочтении "программирования от интерфейса (супертипа), а не его имплементации". В качестве примера приводится то, что в моей программе выглядело бы вот так:
разумеется, Hero - наследник Character. Я правильно понимаю, что при таком объявлении во-первых, не будет ошибки компиляции, во-вторых, везде, где параметр типизируется как Character, мой передаваемый туда hero также пройдёт без ошибок, и в-третьих, если где-то будет обращение к свойству другого наследника Character (например Enemy), я сразу получу ошибку в рантайме? И что вообще уважаемые знатоки думают о таком подходе? |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
ты сразу ограничиваешь функционал своего героя суперклассом Character, теряя всю специфику Hero
|
|
|||||
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Цитата:
|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Цитата:
при условии, что Hero - наследник Character. Более того, если какой-то метод в Character будет записан как "абстрактный" и переопределён в классе-наследнике Hero, то в соответствии с принципом полиморфизма он будет корректно вызван для экземпляра типа Hero, несмотря на то, что объявлен он не с использованием имени суперкласса. Собственно об этом и вопрос. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Ты объявил переменную как Character. Абсолютно неважно, что ты туда запихаешь в рантайме. Компилятор видит, что ты пытаешься вызвать несуществующий метод именно у Character. Это тип переменной, и он не зависит от того, какой конкретно объект туда записан.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
На фига тогда так писать? Или предполагается, что суперкласс полностью абстрактный и не содержит ВООБЩЕ никакой реализации, оставляя всё своим наследникам?
__________________
Не сломано - не чини! |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
часто так пишут в сигнатурах методов, а не при объявлении переменных.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я не понимаю этого вопроса.
Ну вот у тебя допустим объявлена переменная типа Спрайт. Ты можешь туда любую кнопку запихать. Но если ты в коде обратишься к этой переменной не как к Спрайту, а как к кнопке, то получишь ошибку компиляции? Конечно получишь, потому что у Спрайта нет таких свойств которые ты добавил в кнопку-наследника. Для компилятора это Спрайт! Потому что переменная имеет тип Спрайт. И компилятору не надо дожидаться рантайма чтобы указать тебе на ошибку: ты вызываешь свойства и методы, которых нет у данного типа. Если хочешь обращаться к свойствам и методам кнопки, укажи что это кнопка и проблем не будет. Что тут нелогичного?
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Как будто это я придумал
Вот смотрите из книги по шаблонам проектирования, буквально первая глава: // Абстрактный класс public class Polymorphism {public function myMusic():void { // Резервные детали для подклассов }} public class Rock extends Polymorphism {override public function myMusic():void { trace(“Play Jimmie”); }} import flash.display.Sprite; public class PlayMusic extends Sprite{ var rock:Polymorphism; var classic:Polymorphism; var country:Polymorphism; var jazz:Polymorphism; public function PlayMusic():void { rock=new Rock(); rock.myMusic();
__________________
Не сломано - не чини! |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
И? Класс Rock же не создал новый метод, которого нет в Polymorphism. Он переопределил суперметод. В этом и заключается полиморфизм. А вопрос то в чем?)
Переменная rock имеет тип Polymorphism. У типа Polymorphism есть метод myMusic(). У переменной rock вызывается метод myMusic(), который есть у ее типа. Где тут компилятору кричать "Караул!"?
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 07:11. |
|
« Предыдущая тема | Следующая тема » |
|
|