|
Программирование >> Полиморфизм без виртуальных функций в с++
void А::fО { g(); вызывается А::g; квалификация не нужна ... В этом отношении пространства имен ведут себя так же, как классы. 77.4. J. Псевдонимы пространства имен Если пользователь дает своим пространствам имен короткие имена, возможен конфликт, например: namespace А { короткое имя пространства имен когда-нибудь обязательно возникнет конфликт ... Этим достигается обратная совместимость, а для тех, кто не хочет, чтобы имена были доступны неявно, определяется новый заголовочный файл stdio: stdio: namespace std { ... int printf(const char* ... ); . .. Те, кому не нравится дублирование объявлений, конечно, просто включат stdio в определение stdio.h: stdio.h: tinclude <stdio> using namespace std; Думаю, что using-директивы - это, в первую очередь, инструмент, облегчающий переход к пространствам имен. Большинство программ станут яснее, если при обращении к именам из внешних пространств будут использоваться явная квалификация и using-объявления. Конечно, имена из пространства имен, в котором они определены, не требуют никакой квалификации: namespace А { void f(); void g() { f(); вызывается A::f; квалификация не нужна А::String si = asdf ; А::String s2 = Ikjh ; Ho длинные имена писать утомительно: namespace American Telephone and Telegraph { слишком длинное для использования в реальном коде ... American Telephone and Telegraph::String s3 = asdf ; American Telephone and Telegraph::String s4 = Ikjh ; Эту дилемму можно разрешить, введя короткий псевдоним для длинного имени пространства имен: использование псевдонима для длинного имени пространства имен namespace ATT = American Telephone and Telegraph; ATT::String s3 = asdf ; ATT::String s4 = Ikjh ; Такая возможность позволяет пользователю обращаться к библиотеке, не указывая каждый раз ее настоящего имени. Пространства имен можно применять для составления интерфейсов, в которые входят имена, принадлежащие сразу нескольким пространствам: namespace My interface { using namespace American Telephone and Telegraph; using My ovm::String; using namespace 01; разрешить конфликт между определениями Flags из 01 и American Telephone and Telegraph typedef int Flags; ... 77.4.4. Использование пространств имен для управления версиями в качестве примера применения пространств имен показывается, как поставщик библиотеки мог бы воспользоваться ими для решения проблемы несовместимых отличий между разными версиями. Этот прием мне впервые продемонстрировал Тандж Бенетт (Tanj Bennett). Вот первая версия releasel: namespace releasel { ... class X { Impl::Xrep* p; public: virtual void fl() = 0; virtual void f2() = 0; ... ... Impl - это некоторое пространство имен, в котором находятся детали реализации. Пользовательский код мог бы выглядеть так: class XX : public releasel::X { int xxl; ... public: void f1(); void f2(); virtual void ffl(); virtual void ff2(); ... Это значит, что поставщик библиотеки не может изменить размер объектов класса releasel: :Х (например, добавить новые данные-члены), добавить или изменить порядок следования виртуальных функций и т.д., поскольку это потребовало бы перекомпиляции пользовательского кода, чтобы учесть новое размещение объекта в памяти. Существуют реализации C-i-i-, защищающие пользователя от таких изменений, но пока не получившие широкого распространения, так что разработчик библиотеки не может полагаться на них, если не хочет привязать себя к единственному компилятору. Я мог бы посоветовать пользователям не наследовать подобным библиотечным классам таким образом, но ведь, несмотря на все предупреждения, они все равно будут поступать по-своему и жаловаться на необходимость перекомпиляции. Нужно найти другое, более удачное решение. Если воспользоваться пространствами имен для различения версий, вторая версия release2 могла бы выглядеть так: namespace releasel { версия 1 оставлена для совместимости ... class X { Impl::Xrep* р; Impll::Xrep приведена в соответствии с версией 2 public: virtual void fl() = 0; virtual void f2() = 0; ... ...
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |