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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобратся с взаимосвязью классов 
:(
    Опции темы
guram
Дата 10.6.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте,

Требуется реализовать протокол передачи данных от компьютера к устройству.
Передача данных может осуществлятся при помощи COM порта или USB.

Вопрос возник следующего содержания:

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

Также должны быть описанны классы COMPort и USBTransfer для передачи данных.
Механизм передачи (COM порт или USB) задается пользователем.

Также, если же я все правильно понимаю, нам необходим некий класс Communication для связки классов COMPort и USBTransfer.

Но как ето все более правильно описать, чтобы при изменении транспортного уровня не требовалось значительно переделывать весь проект?

Спасибо!
PM MAIL ICQ   Вверх
triclosan
Дата 10.6.2009, 15:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На самом деле единственного правильного подхода реализации задачи посредством ООП не существует. 

Цитата
Передача данных может осуществлятся при помощи COM порта или USB.

если ИЛИ, то не понимаю зачем нужен класс Communication 

Предложу свою модель того, что ты описал:
Код

class Protocol
{
    protected:
        int someProtectedData;

    public:
        void someCommonRoutines();
        virtual void portDependingAction()=0;
};

class COMPort : public Protocol
{
    public:
        virtual void portDependingAction(){/*do actions for COM-prot*/}
};

class USBTransfer : public Protocol
{
    public:
        virtual void portDependingAction(){/*do actions for USB*/}
};


//usage
Protocol *com = new COMPort();
Protocol *usb = new USBTransfer();

com->portDependingAction();
usb->portDependingAction();


Это сообщение отредактировал(а) triclosan - 10.6.2009, 16:00
PM MAIL   Вверх
andrew_121
Дата 10.6.2009, 19:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(guram @  10.6.2009,  15:18 Найти цитируемый пост)
Если я все правильно понимаю в оснавах ООП, то должен быть некий класс Protocol, реализующий методы основного протокола.

С чего бы ему там взяться? smile  Не вижу ничего общего у ООП и коммуникациями. 


Цитата(guram @  10.6.2009,  15:18 Найти цитируемый пост)
Также должны быть описанны классы COMPort и USBTransfer для передачи данных.

Где должны быть?
Кем должны быть описаны?


Цитата(guram @  10.6.2009,  15:18 Найти цитируемый пост)
Но как ето все более правильно описать, чтобы при изменении транспортного уровня не требовалось значительно переделывать весь проект?

Выше, тебе предложили правильную структуру. Тебе осталось только реализовать протоколы COM и USB. Тут тебе поможет гугл.


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


Эксперт
****


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

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



Возможно более гибкое взаимодействие:
Код

class Port {
public:
  virtual ~Port() { }
  virtual void read() = 0;
  virtual void write() = 0;
};
class COMPort: public Port {
public:
  COMPort() { ... }
  ~COMPort() {... }
  void read() { ... }
  void write() { ... }
};

class USBPort: public Port {
public:
  USBPort() { ... }
  ~USBPort() {... }
  void read() { ... }
  void write() { ... }
};
class Protocol {
protected:
  Port* port;
public:
  Protocol(Port* p) : port (p) { ... }
  virtual ~Protocol() { ... }
  virtual void someAction() { ... port->write(); ... port->read(); ... }
};
class Protocol2 : public Protocol {
public:
  Protocol2(Port* p) : Protocol (p) { ... }
  virtual ~Protocol2() { ... }
  virtual void someAction() { ... port->write(); ... port->read(); ... }
};

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


Эксперт
****


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

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



math64 дык можно и еще гибче.... использовать RAII для read\write, используя общий теплейтный класс. Нечто вроде видел в блоге Lazinhttp://evgeny-lazin.blogspot.com/2008/08/blog-post.html


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrew_121
Дата 10.6.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(jonie @  10.6.2009,  22:39 Найти цитируемый пост)
Нечто вроде видел в блоге Lazin: http://evgeny-lazin.blogspot.com/2008/08/blog-post.html

Ух ты smile Я в восторге smile 
Lazin-у респект!


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Разрежте ваш протокол обмена на уровни - приложение, транспорт, физика (и пр). Для каждого уровня определитесь с набором данных и сервисов по их пересылке. Затем для каждого уровня делается абстрактный базовый класс, содержащий чисто виртуальные методы для общения с вышестоящим уровнем, и указатель на имплементацию нижестоящего уровня.
Затем делаются наследники для конкретных реализаций каждого уровня, потом уже инстансы конкретных объектов провязываются в стек (через те самые указатели на имплементацию).
Все, с верхушкой стека можно работать из приложения.

PM MAIL   Вверх
guram
Дата 11.6.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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





Допустим транспортный уровень будет описан абстрактным классом "Transport".
Теперь определим два класс "COMPort" и "USB", которые наследуют "Transport".

Класс протокола "Protocol" будет содиржать ссылку на класс "Transport", но каким образом определить какую из реализаций использовать "COMPort" и "USB"?
PM MAIL ICQ   Вверх
triclosan
Дата 11.6.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Полиморфизм путем виртуальных функций 
PM MAIL   Вверх
xvr
Дата 11.6.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(guram @ 11.6.2009,  14:50)
Допустим транспортный уровень будет описан абстрактным классом "Transport".
Теперь определим два класс "COMPort" и "USB", которые наследуют "Transport".

Класс протокола "Protocol" будет содиржать ссылку на класс "Transport", но каким образом определить какую из реализаций использовать "COMPort" и "USB"?

При инициализации стека содадите (через new) экземпляр COMPort или USB (в зависимости от пожеланий пользователя) и подадите указатель на созданный экземпляр в Protocol как нижний уровень (транспортный)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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