Ivan093 писал(а):
В других языках могут быть предусмотрены специальные средства, которые скрывают от вас все эти детали. Например, в Java имеется встроенный механизм сборки мусора, который сам занимается подсчетом ссылок. Кроме того, один из механизмов Java был позаимствован Microsoft для реализации QueryInterface — речь идет о преобразовании типов. У программиста появляется возможность получить новый интерфейс в виде класса, преобразовав его к нужному типу; возвращаемое значение NULL свидетельствует о том, что интерфейс не поддерживается данным объектом.
Вот интересует последнее предложение, т.е. как из интерфейса получить класс?
Кто-нибудь делал это?
Брехня. В Java есть аналог стандартного С++ dynamic_cast<>. Т.е при включенном RTTI в С++ можно сделать так
Код: Выделить всё
std::auto_ptr<SomeFactory::ProductType> p(SomeFactory::Instance().Create());
MyInterface* mif = dynamic_cast<MyInterface*>(p.get());
if (mif != 0) {
...
mif->mifMethod(...);
...
} else {
throw std::logic_error("Factory has returned unsupported object");
}
В Java 1.4 полный аналог этого выглядит так:
Код: Выделить всё
final Object o = SomeFactory.getInstance().create();
if (o instanceof MyInterface) {
final MyInterface mif = (MyInterface)o;
...
mif.mifMethod(...);
...
} else {
throw new RuntimeException("Factory has returned unsupported object");
}
Подсчета ссылок в Java нет, т.к это не годится для Java. Для внутреннего использования в изолированных компонентах C/C++ использовать его можно, для гетерогенных сред - можно только если аффтар гетерогенной среды типа COM гхм... недальновиден.
Вот интересует последнее предложение, т.е. как из интерфейса получить класс?
CComPtr<IUnknown> o(in_param);
CComPtr<IMyInterface> mif;
o.QueryInterface(mif);
Как-то так: CComPtr берет всю химию по трансформации IUnknown->IMyInterface на себя.