Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ООП] Замещение класса его наследником. 
:(
    Опции темы
Logo
Дата 24.1.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Я в ООП новичок, как такая ситуация называется:
Есть класс A, использующий класс B. Я создал класс B' унаследованный от B. Надо сделать класс A', в котором вместо B используется B'.

Как это называется? Какие языки такое поддерживают? И есть ли готовый модуль для Perl, это реализующий?
PM MAIL   Вверх
comcon1
Дата 24.1.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Раскройте смысл слова "используется".
Возможно имеется ввиду:

==псевдокод==
class A {}

class A_ {}

template <T>
class B extends T {}

b = B<A>();

b_ = B<A_>();
==конец псевдокода==

Слово "модуль" не подходит для паттернов проектирования. Это скорее некие заготовки кода.



--------------------
PM MAIL   Вверх
Logo
Дата 25.1.2010, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
comcon1
Дата 25.1.2010, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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_) будет работать конкретный экземпляр.


--------------------
PM MAIL   Вверх
Logo
Дата 25.1.2010, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Прочитал про template, вещь интересная, но это не то, они полезность для ЯП со статической типизацией. Для того что бы применить их к обозначенной задаче, нужно вмешатся в исходный код класса A / LWP::UserAgent (написанный не мной), и там произвести необходимые замены.
А как бы просто сказать ЯП, что в классе LWP::UserAgent::ExtResponse унаследованным от LWP::UserAgent, все вызовы вроде new HTTP::Response на самом деле будут вызовами new HTTP::Response::Extend (аналогично статические функции и переменные). Таким образом не влезая в чужой код.

OFFTOP:
Если уж заниматься переписыванием кода, проще добавить свои методы к HTTP::Response. Или если ЯП позволяет, добавить их из своей либы при ее импорте.


PM MAIL   Вверх
Simpliest
Дата 26.1.2010, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Logo, есть такое понятие как Dependency Injection
Можно попробовать Decorator(Facade).
Но все это помогает, только если код спроектирован с учетом этой возможности.

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



--------------------
user posted image
PM   Вверх
Logo
Дата 27.1.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Цитата

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


Замещение методов класса первое что приходит в голову. Но оно препятствует дальнейшему повторному использованию кода. Неужели я новую ООП фитчу придумал smile ?
А замещение методов обьекта в Prototype based стиле, хотя и подходит, будет весьма неудобно.

UPD:
Хотя нет, вполне приемлемо, но все же не так удобно, как просто директива.


Это сообщение отредактировал(а) Logo - 27.1.2010, 13:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.