![]() |
Модераторы: Се ля ви |
![]() ![]() ![]() |
|
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Я в ООП новичок, как такая ситуация называется:
Есть класс A, использующий класс B. Я создал класс B' унаследованный от B. Надо сделать класс A', в котором вместо B используется B'. Как это называется? Какие языки такое поддерживают? И есть ли готовый модуль для Perl, это реализующий? |
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Раскройте смысл слова "используется".
Возможно имеется ввиду: ==псевдокод== class A {} class A_ {} template <T> class B extends T {} b = B<A>(); b_ = B<A_>(); ==конец псевдокода== Слово "модуль" не подходит для паттернов проектирования. Это скорее некие заготовки кода. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Я имею ввиду использование статических методов/функций класса, в том числе конструктора, статических переменных класса. Пример из жизни. Есть класс, LWP::UserAgent, предоставляет обьект - браузер. Некоторые его методы возвращают обьект класса HTTP::Response, содержащий ответ сервера- заголовки, контент и т.п. Я написал свой класс, унаследованный от HTTP::Response, к примеру HTTP::Response::Extend, с дополнительными примочками. Теперь надо создать класс наследованный от LWP::UserAgent (либо переопределить сам LWP::UserAgent), что бы он возвращал мне HTTP::Response::Extend. Т.е. директива, которая заставит внутри класса LWP::UserAgent вызов конструктора и статических функций HTTP::Response считать вызовом оных от HTTP::Response::Extend. Как вот такая штука называется, которую эта директива обеспечила бы? В каких языках оно есть? UPD: Шаблоны проектирования я здесь не имел ввиду. Модуль Perl (perlmod) в прямом смысле. Это сообщение отредактировал(а) Logo - 25.1.2010, 01:35 |
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Это та самая штука. называется шаблон. template. Есть она в С++, Java (там называется дженерик) и прочих крутых ЯП. Но можно делать что-то типа этого и в других ЯП. Нужно просто создавать экземпляры HTTP::Response не конструктором а отдельной функцией. Например:
class A { B returnB() { B b = new B(); // some code return b; } function doSomeTh() { // some code B b = new B(); // some code } } class B {} class B_ extends B {} Вот делаешь класс A_, в нем переопределяешь методы, юзающие B и все B b = new B() заменяешь на B b = this->return_B_instance(); и определяешь B return_B_instance() { if (this->param) return new B(); else return new B_(); } ну вот как-то так. Потом в конструкторе класса A_ ты можешь определить с какой именно реализацией (B или B_) будет работать конкретный экземпляр. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Прочитал про template, вещь интересная, но это не то, они полезность для ЯП со статической типизацией. Для того что бы применить их к обозначенной задаче, нужно вмешатся в исходный код класса A / LWP::UserAgent (написанный не мной), и там произвести необходимые замены.
А как бы просто сказать ЯП, что в классе LWP::UserAgent::ExtResponse унаследованным от LWP::UserAgent, все вызовы вроде new HTTP::Response на самом деле будут вызовами new HTTP::Response::Extend (аналогично статические функции и переменные). Таким образом не влезая в чужой код. OFFTOP: Если уж заниматься переписыванием кода, проще добавить свои методы к HTTP::Response. Или если ЯП позволяет, добавить их из своей либы при ее импорте. |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
Logo, есть такое понятие как Dependency Injection
Можно попробовать Decorator(Facade). Но все это помогает, только если код спроектирован с учетом этой возможности. Если вы хотите изменить поведение не вашего кода, который зависит от еще какого-то кода, то попробуйте использовать рефлексию для изменения поведения уже существующих объектов. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Замещение методов класса первое что приходит в голову. Но оно препятствует дальнейшему повторному использованию кода. Неужели я новую ООП фитчу придумал ![]() А замещение методов обьекта в Prototype based стиле, хотя и подходит, будет весьма неудобно. UPD: Хотя нет, вполне приемлемо, но все же не так удобно, как просто директива. Это сообщение отредактировал(а) Logo - 27.1.2010, 13:57 |
|||
|
||||
![]() ![]() ![]() |
Правила раздела "Философия программирования": | |
|
Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО: • вопросы перспективного развития методов написания ПО; • изменяющиеся языки и методологии программирования; Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Философия программирования | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |