Здравствуйте, abrec, Вы писали:
A>Какой из вариантов более пацанский
2, т.к. позволяет расширять набор транспортов не модифицируя зависимый от них класс (CMegaData), или модифицированный 1: CMegaData::Init(ITransport* t);
Re[2]: Сейчас глупый вопрос спрошу, только не обижайтесь
А>2, т.к. позволяет расширять набор транспортов не модифицируя зависимый от них класс (CMegaData), или модифицированный 1: CMegaData::Init(ITransport* t);
Я предпочел бы первый, заменив switch() на вызов фабрики.
Re: Сейчас глупый вопрос спрошу, только не обижайтесь
Здравствуйте, abrec, Вы писали:
A>Какой из вариантов более пацанский
Ну у тебя в одном случае динамическое все, а в другом — статическое.
Однозначно ответить на вопрос, что лучше, не зная всей истории, нельзя.
Когда-то хорошо одно, когда-то — другое.
Все зависит от твоей ситуации и твоих целей.
В варианте с динамикой у тебя нарушено правило Single Responsibility, которое гласит, что каждый должен заниматься чем-то одним, а у тебя класс одновременно и с интерфейсом общается, и динамически выбирает, какой интерфейс ему создать.
Я в таких случаях бью все это на два (пользователь/фабрика) либо на три (пользователь/фабрика/фасад для объединения обоих) класса.
В варианте со статикой, вроде, проблем не видно.
В любом случае, смущает именование классов (интерфейс/данные) в соединении со схемой владения: почему это вдруг данные содержат интерфейс?
По идее, они вообще ничего о нем знать не должны.
Здравствуйте, jazzer, Вы писали:
J>В любом случае, смущает именование классов (интерфейс/данные) в соединении со схемой владения: почему это вдруг данные содержат интерфейс? J>По идее, они вообще ничего о нем знать не должны.
J>Так что либо неудачное имя, либо ошибка дизайна.
Согласен. В реалии так.
class CBridge
{
private:
ITransport* m_pTransport;
CTEDataBase* m_pDB;
};
Re: Сейчас глупый вопрос спрошу, только не обижайтесь
В 1 варианте необходимо во всех классах *Transport внести реализацию GetReply2(szBuf, lBufSize)
Во 2 варианте только в те классы которыми инстанцированы (по моему так это называется) объекты СMegaData, зовущие GetReply2(szBuf, lBufSize)
Я ошибаюсь??
Re: Сейчас глупый вопрос спрошу, только не обижайтесь
Помимо прочего, в первом варианте есть ошибка.
Деструктор ITransport должен быть виртуальным, поскольку в CMegaData::~CMegaData() используется полиморфное разрушение:
Здравствуйте, abrec, Вы писали:
A>//**************Вариант 1*****************
A>class ITransport
A>{
A>public:
A> ITransport(){};
A> virtual ~ITransport(){};
A> ...
Re[2]: Сейчас глупый вопрос спрошу, только не обижайтесь
Здравствуйте, Аноним, Вы писали:
А>Помимо прочего, в первом варианте есть ошибка. А>Деструктор ITransport должен быть виртуальным, поскольку в CMegaData::~CMegaData() используется полиморфное разрушение:
А>Здравствуйте, abrec, Вы писали: А>
Здравствуйте, abrec, Вы писали:
A>Какой из вариантов более пацанский A>
...
A>
Во-первых, второй вариант тогда уж должен быть "более" статическим, т.е. совсем без виртуальных функций.
Во-вторых, по примерам видно, что предполагается одинаковое использование классов, так что я бы предпочёл первый вариант — имхо наследование в этом случае лучше отражает "природу" задачи.
PS.
Хотя когда-то давно писал похожий велосипед — там у меня было много чего намешано шаблонного (всяких CRTP) и нешаблонного, получилось имхо красиво — но вот тому, кто сейчас этот код поддерживает, наверное, очень не хочется в нём разбираться Впрочем, насколько я знаю, за несколько лет повода не было
Курица — это инструмент, с помощью которого одно яйцо производит другие.