Volání a přepsání základního typu pomocí C++/WinRT

Důležité

Základní koncepty a termíny, které podporují pochopení toho, jak využívat a vytvářet třídy modulu runtime pomocí C++/WinRT, najdete v tématu Využití rozhraní API s rozhraními C++/WinRT a Author API s C++/WinRT.

Implementace přepisovatelných metod, jako jsou MeasureOverride a OnApplyTemplate

Xaml má několik bodů rozšíření, ke kterým se vaše aplikace může připojit, například:

Odvozujete vlastní ovládací prvek z třídy modulu runtime Control , která je dále odvozena od základních tříd modulu runtime. A existují overridable metody Control, FrameworkElement a UIElement , které můžete přepsat v odvozené třídě. Tady je příklad kódu, který ukazuje, jak to udělat.

struct BgLabelControl : BgLabelControlT<BgLabelControl>
{
...
    // Control overrides.
    void OnPointerPressed(Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& /* e */) const { ... };

    // FrameworkElement overrides.
    Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size const& /* availableSize */) const { ... };
    void OnApplyTemplate() const { ... };

    // UIElement overrides.
    Microsoft::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer() const { ... };
...
};

Metody, které lze přepsat, se v různých jazykových projekcích zobrazují jinak. V jazyce C# mají například metody, které lze přepsat, obvykle podobu chráněných virtuálních metod. V jazyce C++/WinRT nejsou virtuální ani chráněné, ale přesto je můžete přepsat a poskytnout vlastní implementaci, jak je znázorněno výše.

Pokud v jazyce C++/WinRT přepisujete jednu z těchto přepisovatelných metod, soubor IDL runtimeclass nesmí tuto metodu deklarovat. Další informace o zobrazené syntaxi base_type najdete v následující části tohoto tématu (Volání základního typu).

IDL

namespace Example
{
    runtimeclass CustomVSM : Microsoft.UI.Xaml.VisualStateManager
    {
        CustomVSM();
        // note that we don't declare GoToStateCore here
    }
}

C++/WinRT

namespace winrt::Example::implementation
{
    struct CustomVSM : CustomVSMT<CustomVSM>
    {
        CustomVSM() {}

        bool GoToStateCore(winrt::Microsoft::UI::Xaml::Controls::Control const& control, winrt::Microsoft::UI::Xaml::FrameworkElement const& templateRoot, winrt::hstring const& stateName, winrt::Microsoft::UI::Xaml::VisualStateGroup const& group, winrt::Microsoft::UI::Xaml::VisualState const& state, bool useTransitions) {
            return base_type::GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
        }
    };
}

Volání základního typu

Ke svému základnímu typu můžete přistupovat a volat jeho metody pomocí aliasu typu base_type. Viděli jsme příklad toho v předchozí části; ale můžete použít base_type k přístupu k libovolnému členu základní třídy (nejen k přepsaným metodám). Tady je příklad:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

    void Foo()
    {
        // Call my base type's Bar method.
        base_type::Bar();
    }
};

Důležitá rozhraní API