Что такое составной класс среды выполнения?

Я экспериментирую с созданием простого приложения xaml с использованием C ++ / WinRT.

Я пришел из фона WPF, где довольно часто бывает базовый класс, реализующий INotifyPropertyChanged, и другие классы наследуются от него.

Когда я пытаюсь сделать то же самое с C ++ - WinRT, я выхожу из строя с ошибкой

error MIDL4006: [msg]A runtime class can derive only from a composable runtime class.

Вот остальная часть соответствующего кода для справки:

ObservableObject.idl:

namespace Example
{
    runtimeclass ObservableObject : Windows.UI.Xaml.DependencyObject, Windows.UI.Xaml.Data.INotifyPropertyChanged
    {
        ObservableObject();
    }
}

MainViewModel.idl:

import "ObservableObject.idl";

namespace Example
{
    runtimeclass MainViewModel : ObservableObject
    {
        MainViewModel();
        Int32 MyProperty;
    }
}

Так что же такое составной класс среды выполнения? Есть ли способ добиться этого с помощью C ++ / WinRT? Я действительно не хочу повторять реализацию INotifyPropertyChanged каждый раз, когда я определяю новый связываемый класс.


person    schedule 28.07.2018    source источник
comment
По умолчанию MIDL обрабатывает все классы как sealed, что означает, что они не могут быть производными от. Используйте ключевое слово unsealed, чтобы ваш класс мог быть базовый класс. Композиция - это термин ABI для обозначения производных.   -  person Raymond Chen    schedule 28.07.2018
comment
Вам также необходимо добавить ObservableObject в качестве второго аргумента шаблона в автоматически сгенерированный базовый класс типа реализации. struct MainViewModel: MainViewModelT ‹MainViewModel, ObservableObject›   -  person Elad Maimoni    schedule 28.07.2018


Ответы (1)


Если вы наследуете от DependencyObject, вам фактически не нужно реализовывать INotifyPropertyChanged, и наоборот (даже в WPF).

Наследование настраиваемого runtimeclass не рекомендуется в типах WinRT, поскольку JavaScript не знает наследования, поэтому в этом случае App Cert Kit завершится ошибкой.

Если вы не хотите каждый раз писать одну и ту же логику, объявите собственный класс C ++ и реализуйте интерфейсы (НЕ наследовать winrt::implement). Позвольте классам реализации наследовать от него.

person Berrysoft    schedule 24.12.2018