Memanggil dan meng-override tipe dasar Anda dengan C++/WinRT

Important

Untuk konsep dan istilah penting yang mendukung pemahaman Anda tentang cara menggunakan dan menulis kelas runtime dengan C++/WinRT, lihat Menggunakan API dengan C++/WinRT dan API Penulis dengan C++/WinRT.

Menerapkan metode yang dapat diganti , seperti MeasureOverride dan OnApplyTemplate

Ada beberapa titik ekstensi di XAML yang dapat dicolokkan aplikasi Anda, misalnya:

Anda mendapatkan kontrol kustom dari kelas Runtime Kontrol , yang selanjutnya berasal dari kelas runtime dasar. Dan ada overridable metode Kontrol, FrameworkElement, dan UIElement yang dapat Anda ambil alih di kelas turunan Anda. Berikut adalah contoh kode yang menunjukkan kepada Anda cara melakukannya.

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 { ... };
...
};

Metode yang dapat dioverride ditampilkan secara berbeda dalam proyeksi bahasa yang berbeda. Di C#, misalnya, metode yang dapat diganti biasanya muncul sebagai metode virtual yang dilindungi. Di C++/WinRT, mereka bukan virtual atau dilindungi, tetapi Anda masih dapat mengambil alih dan memberikan implementasi Anda sendiri, seperti yang ditunjukkan di atas.

Jika Anda meng-override salah satu metode yang dapat dioverride ini di C++/WinRT, maka IDL Anda runtimeclass tidak boleh mendeklarasikan metode tersebut. Untuk informasi selengkapnya tentang sintaks yang ditampilkan base_type, lihat bagian berikut dalam topik ini (Memanggil tipe dasar Anda).

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);
        }
    };
}

Memanggil tipe dasar Anda

Anda dapat mengakses tipe dasar Anda dan memanggil metode padanya dengan menggunakan alias tipe base_type. Kami melihat contoh ini di bagian sebelumnya; tetapi Anda dapat menggunakan base_type untuk mengakses anggota kelas induk apa pun (bukan hanya metode yang ditimpa). Berikut adalah sebuah contoh:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

API penting