Лучший способ использовать Интерфейс C++

Вы можете использовать метки:

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}
6
задан Seth 29 July 2009 в 22:50
поделиться

7 ответов

Одна из наиболее распространенных причин использования интерфейса - это то, что вы можете «программировать против абстракции», а не конкретной реализации.

Самым большим преимуществом этого является то, что он позволяет изменять части вашего кода, сводя к минимуму изменения в оставшемся коде.

Поэтому, хотя мы не знаем полной предыстории того, что вы создаете, я бы пошел для подхода Интерфейс / Завод.

Сказав это, в небольших приложениях или прототипах я часто начинаю с конкретных классов, пока не почувствую, где / если интерфейс был бы желателен. Интерфейсы могут вводить уровень косвенности, который может просто не быть необходимым для масштаба создаваемого вами приложения.

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

9
ответ дан 8 December 2019 в 13:01
поделиться

Есть еще одна альтернатива, о которой вы не упомянули:

int main(int argc, char* argv[])
{
   //...
   boost::shared_ptr<IInterface> test(new AImplementation);
   //...
   return 0;
}

Другими словами, можно использовать интеллектуальный указатель без использования статической функции «создания». Я предпочитаю этот метод, потому что функция «create» ничего не добавляет, кроме раздувания кода, в то время как преимущества интеллектуальных указателей очевидны.

5
ответ дан 8 December 2019 в 13:01
поделиться

В вашем вопросе есть две отдельные проблемы: 1. Как управлять хранилищем созданного объекта. 2. Как создать объект.

Часть 1 проста - вы должны использовать умный указатель, такой как std :: tr1 :: shared_ptr, чтобы предотвратить утечки памяти, которые в противном случае потребовали бы причудливой логики try / catch.

Часть 2 больше

Вы не можете просто написать create () в main (), как хотите - вам придется написать IInterface :: create (), потому что в противном случае компилятор будет искать глобальную функцию с именем create, что не то, что вы хотите. Может показаться, что инициализация 'std :: tr1 :: shared_ptr test' значением, возвращаемым create (), будет делать то, что вы хотите, но компиляторы C ++ работают не так.

использование фабричного метода в интерфейсе - лучший способ сделать это, чем просто использование нового AImplementation (), возможно, это будет полезно в вашей ситуации,

2
ответ дан 8 December 2019 в 13:01
поделиться

В каком смысле "лучше"?

Фабричный метод не принесет вам многого, если вы планируете иметь, скажем, один конкретный класс. (Но опять же, если вы планируете иметь только один конкретный класс, действительно ли вам вообще нужен интерфейсный класс? Может быть, да, если вы используете COM.) В любом случае, если вы можете предвидеть небольшой фиксированный лимит на количество конкретных классов, тогда более простая реализация может быть «лучшей» в целом.

Но если конкретных классов может быть много, и если вы не хотите, чтобы базовый класс был тесно связан с их, тогда может быть полезен фабричный шаблон.

И да, этот может помочь уменьшить взаимосвязь - если базовый класс предоставляет производным классам какие-то средства для регистрации себя в базовом классе.

1
ответ дан 8 December 2019 в 13:01
поделиться

Используйте 1-й способ. Ваш фабричный метод во втором варианте должен быть реализован для каждого конкретного класса, а это невозможно сделать в интерфейсе. То есть, IInterface :: create () не знает, какой именно конкретный класс вы действительно хотите создать.

Статический метод не может быть виртуальным, и реализация нестатического метода create () в ваших конкретных классах на самом деле вас не выиграла. что-нибудь в этом случае.

Заводские методы, безусловно, полезны, но это неправильное использование.

Какой элемент в Эффективном C ++ рекомендует второй вариант? В своей не вижу (хотя и второй книги у меня нет). Это может устранить недопонимание.

1
ответ дан 8 December 2019 в 13:01
поделиться

У меня есть очень простой вопрос:

Вы уверены, что хотите использовать указатель?

Этот вопрос может показаться нелогичным, но люди, работающие с Java, часто используют новые чаще, чем требуется. В вашем примере достаточно создать переменную в стеке.

0
ответ дан 8 December 2019 в 13:01
поделиться

Я бы выбрал первый вариант только потому, что он более распространен и понятнее. Это действительно зависит от вас, но если вы работаете над коммерческим приложением, я бы спросил, что мои коллеги, что они используют.

0
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: