interface
и sealed
были добавлены MS для реализации C ++ / CLI. Однако в текущих версиях компилятора Microsoft также поддерживается ключевое слово sealed
для собственного кода , но это расширение, которое вы, вероятно, никогда не найдете в других местах.
Обратите внимание, что MS сделала нечто подобное с override
- это расширение ключевого слова в MSVC, которое указывает, что функция предназначена для переопределения виртуальной функции базового класса (компилятор будет жаловаться, если это не так).
По какой-то причине Microsoft не сделала то же самое для ключевого слова interface
, но у них есть расширение ключевого слова __interface
, которое соответствует вашим ожиданиям. Я подозреваю, что они не добавили собственное расширение ключевого слова interface
, потому что идентификатор interface
встречается во многих существующих кодах (возможно, в виде макроса, который разрешается до class
) - но это всего лишь предположение с моей стороны ,
Еще один фактор того, почему __interface
имеет подчеркивания, в то время как sealed
и override
не может быть, потому что последние являются "контекстно-зависимыми ключевыми словами" - технология, которую MS ввела в C ++ / CLI, который делает некоторые ключевые слова идентификаторов только в определенных контекстах грамматики - таким образом, sealed
и override
могут все еще использоваться как имена переменных или функций, даже если они также используются в качестве ключевых слов. Компилятор может определить из контекста, какое использование целесообразно. Может быть, они не могли сойти с рук за interface
.
В любом случае, вы можете получить лучшее из обоих миров с чем-то вроде:
#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#define INTERFACE __interface
#else
#define OVERRIDE
#define SEALED
#define INTERFACE class
#endif
, который я украдкой украл у: