о CppWinRT внутренний 3

#cppwinrt

Вопрос:

Каков пример использования composable_factory ? Кажется , это связано с m_outer , но я не могу найти никакого кода, вызывающего его (поискал все файлы в каталоге cppwinrt). Большое спасибо!!!

Комментарии:

1. Вы ознакомились с документацией ?

2. Исходя из этого, здесь упоминается, что интерфейс фабрики композиций используется для создания составных экземпляров класса. Составной фабричный интерфейс объявляет ноль или более составных фабричных методов, которые можно использовать для активации экземпляров класса в целях составления. Обратите внимание, что законно иметь составной заводской интерфейс с нулевыми заводскими методами. Это означает, что класс может использоваться для композиции, но что третьи стороны не могут непосредственно составлять класс.

Ответ №1:

composable_factory используется для построения типов, допускающих наследование. В среде выполнения Windows, поскольку базовый класс и производные классы могут находиться в отдельных компонентах или даже написаны на разных языках, они используют агрегацию COM, чтобы объединить базовые и производные классы в то, что кажется клиенту единым объектом. Хорошим примером этого было бы, если бы вы создали свой собственный класс MyButton, который не является закрытым / окончательным. Он будет как составлять с помощью кнопки, так и выводиться другими классами.

Подобно activation_factory, composable_factory служит специализированной фабрикой активации для создания экземпляров объектов, используя базовый класс для получения во время построения. Вы можете увидеть, как это сочетается с внутренними и внешними элементами здесь:

https://github.com/microsoft/cppwinrt/blob/c36cf05f5030726c8ada1b89fc78bd470f737032/strings/base_composable.h

Я считаю, что m_outer обычно является базовым классом, а inner-производным.

Ben

Комментарии:

1. «Я считаю, что m_outer обычно является базовым классом, а inner-производным», Нет, я думаю, что m_outer-это производный класс, а m_inner-базовый класс. Возьмем Windows.UI.Xaml.Application в качестве примера, когда мы объявляем что-то подобное struct App : ApplicationT<App>{...} , мы исходим App из Application и App.m_inner будем ссылкой на Application . В этом примере сочиняется, но не сочиняется и не существует. App App.m_outer Application составлен и будет содержать ссылку на App него как на свой outer .