Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно организовать иерархию классов 
:(
    Опции темы
ivans
Дата 21.8.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Посоветуйте, как организовать следующую иерархию классов:

     Elevator  Forklift    Crane
          \                |             /
           \               |            /
         AppDependentVehicle
                           |
               GenericVehicle

GenericVehicle реализует обобщённый функционал для любого вида повозок.  Elevator, Forklift, Crane и т.д. - специализации Vehicle для конкретного типа повозки. Предполагается, что эта система классов оформляется в виде библиотеки, которая должна использоваться в различных приложениях.

Есть необходимость добавлять некоторые функции, общие для всех типов повозок (т.е. принадлежащие к Vehicle), но зависимые от конкретного типа приложения, в котором эти классы будут использоваться. Причём набор дополнительных функций не сводится к какому-то стандартному интерфейсу, то есть просто набор предопределённых виртуальных функций здесь не поможет.

Иначе говоря я хочу модифицировать поведение базового класса в зависимости от конкретного приложения, в котором он используется: иметь возможность заменять AppDependentVehicle для конкретного приложения не изменяя производных классов (Elevator и т.д.). В идеальном варианте иметь стандартную библиотеку с GenericVehicle, Elevator, Forkfilft, Crane и для каждого приложения предоставлять собственный AppDependentVehicle.

Реально это?

С уважением

PM MAIL   Вверх
andrew_121
Дата 21.8.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



ivans, Да, это абсолютно реально. Наследование и виртуальные функции тебе помогут.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
ivans
Дата 21.8.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как мне это поможет? Как я могу замещать AppDependentVehicle не перекомпилируя Elevator,  Forklift,  Crane? Тем более если для каждого приложения описание AppDependentVehicle может радикально отличаться?
PM MAIL   Вверх
mes
Дата 21.8.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(ivans @  21.8.2008,  18:58 Найти цитируемый пост)
Как мне это поможет? Как я могу замещать AppDependentVehicle не перекомпилируя Elevator,  Forklift,  Crane? 


А как планируется без компиляции, чтоб Elevator,  Forklift,  Crane узнали об изменениях AppDependentVehicle  ?
Если они от него не зависят, то и ненадо эту функциональность наваливать на базовый класс. 


--------------------
PM MAIL WWW   Вверх
ivans
Дата 21.8.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Реально Elevator должен наследовать напрямую от Vehicle. Но для различных приложений мне нужно расширить именно базовый класс (vehicle), при этом взаимодействие Vehicle <=> Elevator не меняется. Vehicle имеет некоторые виртуальные функции которые предоставляют интерфейс с приложением для базового класса.
PM MAIL   Вверх
mes
Дата 21.8.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(ivans @  21.8.2008,  20:15 Найти цитируемый пост)
которые предоставляют интерфейс с приложением для базового класса. 

какие например ?


--------------------
PM MAIL WWW   Вверх
mes
Дата 21.8.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



вот например можно примерно  так :
Код

//-----------------------------------------
// имплементация которая будет выделена в библиотеку
class VehicleImpl
{

    public:
                 VehicleImpl () {}
        virtual ~VehicleImpl () =0;

        void f1 () { do_f1(); }
        void f2 () { do_f2(); }
    protected:
        virtual void do_f1() =0;
        virtual void do_f2() =0;


};

class ElevatorImpl :public VehicleImpl ..
class ForkliftImpl :public VehicleImpl ..
class CraneImpl    :public VehicleImpl ..

//-----------------------------------------
// классы приложения представляюшие прослойку для использования в приложении..

class Vehicle
{
    public:
         Vehicle() : p_impl (NULL) {}
         Vehicle(VehicleImpl  *pimpl) : p_impl (NULL) {}
         virtual ~Vehicle() { if (p_impl) delete p_impl; }
    public:
        void f1 () { p_impl->f1(); }
        void f2 () { p_impl->f2(); }

    private:
        VehicleImpl * p_impl;
};

class Elevator :public Vehicle
{
    public :
      Elevator() :Vehicle (new ElevatorImpl) {  }
  protected:
      Elevator(VehicleImpl  *pimpl) : Vehicle (pimpl) {} // необходим , чтоб не затереть нашу виртуальную таблицу 
};

class SuperElevator : public Elevator
{
    public :
      SuperElevator() : Elevator (new SuperElevatorImpl) { }
  protected:
      SuperElevator(VehicleImpl  *pimpl) : Elevator (pimpl) {} // необходим , чтоб не затереть нашу виртуальную таблицу 
};
...



Это сообщение отредактировал(а) mes - 22.8.2008, 10:14


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


Опытный
**


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

Репутация: 27
Всего: 32



Proposed resolution:

Код

class GenericVehicle : public AppDependentVehicle
{
    // implementation
};

Файл с данным кодом поставляем в виде заголовочного файла библиотеки. Для каждого приложения реализуем свой класс AppDependentVehicle. Заголовочный файл библиотеки подлючаем после определения AppDependentVehicle. Для обращения к членам GenericVehicle из AppDependentVehicle можно использовать downcast посредством static_cast.

Это сообщение отредактировал(а) UnrealMan - 22.8.2008, 01:23
PM MAIL   Вверх
ivans
Дата 22.8.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем ответившим. Я буду переделывать библиотеку на основе примеров от тов. mes: Vehicle будет просто адаптером к Vehicle implementation. По умолчанию библиотека содержит базовую реализацию VehicleImplementation, которая при необходимости расширяется приложением. Кроме того Vehicle будет предоставлять метод, возвращающий ссылку на текущую implementation для выполнения нестандартных операций, специфичных для приложения.

P.S. Что значит зашоренность! Я на похожие реализации постоянно в qt наталкивался! smile Но чтоб применить к собственной программе понадобился совет со сотороны! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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