C ++ определить интерфейс - PullRequest
5 голосов
/ 27 апреля 2011
#define interface class

(здесь больше - http://www.codeproject.com/KB/cpp/CppInterfaces.aspx)

Имеет ли это смысл?Разъясняет ли это разницу между интерфейсами и реализующими их классами?Или это сбивает с толку, потому что очевидно, что чисто виртуальные классы являются интерфейсами?

Вы используете это?или "макросы злые"?

Ответы [ 8 ]

15 голосов
/ 27 апреля 2011

Я бы сказал, что это бессмысленно.«Решение», предложенное в этой статье, выглядит как ужасный беспорядок - что не так с использованием C ++ как есть?Зачем вводить какие-то дурацкие макросы, когда вы можете просто определить чистый абстрактный класс, когда он вам нужен, и покончить с ним?

Похоже, кто-то с C # / Java-фоном пытался найти свой путь в C ++ и заблудился,Это может привести к ошибкам и путанице только в том случае, если разработчики действительно знакомы с C ++.

11 голосов
/ 27 апреля 2011

Я действительно не предлагаю использовать эти уловки, я считаю умным . Макросы - это не зло, , но , если кто-то включает ваш код и использует interface в качестве имени переменной (почему бы и нет?), Почему он / она должен потратить 1 час на отладку с gcc -E, потому что кто-то решил "интерфейс" (который не является C ++) был бы умнее?

Мне это не нравится.

11 голосов
/ 27 апреля 2011

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

Лучший способ определения интерфейсов - использоватьобщее соглашение, такое как присвоение им имени «I» в качестве первого символа.

10 голосов
/ 27 апреля 2011

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

Программист C ++, которого вы нанимаете на улице, будет знать, что базовый класс со всеми чисто виртуальными методами и без реализации является интерфейсом,Они будут знать, что публичное наследование от него означает реализацию этого интерфейса.Они не будут знать сумасшедший макроязык, указанный в этой статье.

Я также добавил бы, что идиомы особенно важны в C ++ из-за способности по-настоящему сбить вашу ногу с ног, если вы не будете осторожны.На самом деле обычно используемые идиомы в C ++ могут быть самой мощной функцией C ++.

5 голосов
/ 27 апреля 2011

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

4 голосов
/ 27 апреля 2011

Это плохо. Я бы этим не воспользовался.

Условно: все определения в C / C ++ обычно пишутся заглавными буквами, чтобы всем читателям было ясно, что это определение, и чтобы избежать конфликтов имен с именами функций или переменных.

Практически: это очень распространенное название "интерфейс", и его использование будет опасно только на этом основании. Но, конечно, вы могли бы сделать имя более четким, например, MY_PLATFORM_INTERFACE или что-то в этом роде.

Философски: Это явно неудачная попытка превратить C ++ в более чистый язык ООП, такой как Java или C #, и попытаться каким-то образом сделать синтаксис C ++ более знакомым новичкам из мира Java / C #. Язык программирования это то, что он есть. Если вы хотите внести глубокие изменения, обратитесь в стандартный комитет и будьте готовы предоставить убедительные доказательства. Я думаю, что такое небольшое изменение в синтаксисе смешно. Я не думаю, что кто-то не сможет переключиться на C ++, потому что он не может привыкнуть к мысли, что ключевое слово интерфейса не существует в C ++.

Идиоматически: когда вы программируете на C ++, вы должны ожидать, что программисты на C ++ будут просматривать или просматривать ваш код. Если вы представите такую ​​вещь, которая может выглядеть как неясное специфичное для компилятора расширение C ++, вы можете отбросить настоящего программиста на C ++, и он может потратить свое драгоценное время на размышления о том, какой компилятор или расширение используется для включения этого ключевого слова «interface». Придерживайтесь идиоматического синтаксиса C ++, когда это возможно. В противном случае, вам придется комментировать, рядом с каждым использованием «интерфейса», что это ключевое слово является просто определением для «класса», и в этом случае вы можете просто прокомментировать объявление класса, что этот класс является интерфейсом и просто используйте ключевое слово "class", как обычно.

2 голосов
/ 20 июня 2012

вместо

#define interface class

Попробуйте вместо этого использовать ключевое слово Visual C ++ __ interface и напишите свой #define следующим образом:

#ifndef _MSC_VER
#define __interface class
#endif

Также добавьте префикс ваших классов интерфейса к обычному «I» для дополнительной ясности, как предложил @ jonathan-wood.

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

2 голосов
/ 27 апреля 2011

У меня нет смысла делать это. Как это помогает сделать код более читабельным для разработчиков? Или даже не пытаясь сделать его более темным?

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

...