Aracılığıyla paylaş


Arabirimler (C++/CX)

Bir başvuru sınıfı en fazla bir somut temel sınıftan devralınsa da, herhangi bir sayıda arabirim sınıfı uygulayabilir. Bir arabirim sınıfı (veya arabirim yapısı) birden çok arabirim sınıfını devralabilir (veya gerektirebilir), üye işlevlerini aşırı yükleyebilir ve tür parametrelerine sahip olabilir.

Özellikler

Arabirim şu özelliklere sahiptir:

  • Arabirim sınıfı (veya yapısı) bir ad alanı içinde bildirilmelidir ve genel veya özel erişilebilirliği olabilir. Meta verilerde yalnızca ortak arabirimler yayılır.

  • Bir arabirimin üyeleri özellikleri, yöntemleri ve olayları içerebilir.

  • Tüm arabirim üyeleri örtük olarak genel ve sanaldır.

  • Alanlara ve statik üyelere izin verilmez.

  • Özellikler, yöntem parametreleri veya dönüş değerleri olarak kullanılan türler yalnızca Windows Çalışma Zamanı türler olabilir; bu, temel türleri ve numaralandırma sınıfı türlerini içerir.

Bildirim ve kullanım

Aşağıdaki örnekte bir arabirimin nasıl bildir olduğu gösterilmektedir. Bir arabirimin sınıf veya yapı türü olarak bildirilebildiğine dikkat edin.

namespace InterfacesTest
{
    public enum class PlayState {Playing, Paused, Stopped, Forward, Reverse};

    public ref struct MediaPlayerEventArgs sealed
    {
        property PlayState oldState;
        property PlayState newState;
    };

    public delegate void OnStateChanged(Platform::Object^ sender, MediaPlayerEventArgs^ a);
    public interface class IMediaPlayer // or public interface struct IMediaPlayer 
    {
        event OnStateChanged^ StateChanged;
        property Platform::String^ CurrentTitle;
        property PlayState CurrentState;
        void Play();
        void Pause();
        void Stop();
        void Back(float speed);
        void Forward(float speed);
    };
}

Bir arabirimi uygulamak için, bir başvuru sınıfı veya başvuru yapısı sanal yöntemleri ve özellikleri bildirir ve uygular. Arabirim ve uygulayan ref sınıfı, bu örnekte gösterildiği gibi aynı yöntem parametre adlarını kullanmalıdır:

public ref class MyMediaPlayer sealed : public IMediaPlayer
{
public:
    //IMediaPlayer
    virtual event OnStateChanged^ StateChanged;
    virtual property Platform::String^ CurrentTitle;
    virtual property PlayState CurrentState;
    virtual void Play()
    {
        // ...
        auto args = ref new MediaPlayerEventArgs(); 
        args->newState = PlayState::Playing;
        args->oldState = PlayState::Stopped;
        StateChanged(this, args);
    }
    virtual void Pause(){/*...*/}
    virtual void Stop(){/*...*/}
    virtual void Forward(float speed){/*...*/}
    virtual void Back(float speed){/*...*/}
private:
    //...
};

Arabirim devralma hiyerarşileri

Bir arabirim bir veya daha fazla arabirimden devralabilir. Ancak bir başvuru sınıfı veya yapısından farklı olarak, arabirim devralınan arabirim üyelerini bildirmez. B arabirimi A arabiriminden devralıyorsa ve C başvuru sınıfı B'den devralıyorsa, C'nin hem A hem de B'yi uygulaması gerekir. Bu, sonraki örnekte gösterilmiştir.

public interface struct A { void DoSomething(); };
public interface struct B : A { void DoSomethingMore();};

public ref struct C sealed : B
{
    virtual void DoSomething(){}
    virtual void DoSomethingMore(){}
};


Arabirim özelliklerini ve olaylarını uygulama

Önceki örnekte gösterildiği gibi, arabirim özelliklerini uygulamak için önemsiz sanal özellikleri kullanabilirsiniz. Ayrıca uygulama sınıfında özel alıcı ve ayarlayıcılar da sağlayabilirsiniz. Hem alıcı hem de ayarlayıcı bir arabirim özelliğinde ortak olmalıdır.

//Alternate implementation in MediaPlayer class of IMediaPlayer::CurrentTitle
virtual property Platform::String^ CurrentTitle
{
    Platform::String^ get() {return "Now playing: " + _title;}
    void set(Platform::String^ t) {_title = t; }
}

Bir arabirim bir get-only veya set-only özelliği bildirirse, uygulayan sınıfın açıkça bir alıcı veya ayarlayıcı sağlaması gerekir.

public interface class IMediaPlayer
{
    //...
    property Platform::String^ CurrentTitle
    {
        Platform::String^ get();           
    }
};

public ref class MyMediaPlayer3 sealed : public IMediaPlayer
{
public:
    //...
    virtual property Platform::String^ CurrentTitle
    {
        Platform::String^ get() {return "Now playing: " + _title;}
    }
private:
    Platform::String^ _title;
};

Ayrıca uygulayan sınıftaki olaylar için özel ekleme ve kaldırma yöntemleri de uygulayabilirsiniz.

Açık arabirim uygulaması

Bir başvuru sınıfı birden çok arabirim uyguladığında ve bu arabirimlerde adları ve imzaları derleyiciyle aynı olan yöntemler varsa, bir sınıf yönteminin uyguladığı arabirim yöntemini açıkça belirtmek için aşağıdaki söz dizimini kullanabilirsiniz.

public interface class IArtist
{     
    Platform::String^ Draw();
};

public interface class ICowboy
{
    Platform::String^ Draw();
};

public ref class MyClass sealed : public IArtist, ICowboy
{
public:     
    MyClass(){}     
    virtual  Platform::String^ ArtistDraw() = IArtist::Draw {return L"Artist";}
    virtual  Platform::String^ CowboyDraw() = ICowboy::Draw {return L"Cowboy";}
};

Genel arabirimler

C++/CX'te generic anahtar sözcüğü parametreli Windows Çalışma Zamanı türünü temsil etmek için kullanılır. Parametreli tür meta verilerde yayılır ve tür parametrelerini destekleyen herhangi bir dilde yazılmış kod tarafından kullanılabilir. Windows Çalışma Zamanı bazı genel arabirimleri (örneğin, Windows::Foundation::Collections::IVector<T>) tanımlar, ancak C++/CX'te genel kullanıcı tanımlı genel arabirimlerin oluşturulmasını desteklemez. Ancak, özel genel arabirimler oluşturabilirsiniz.

Genel arabirim yazmak için Windows Çalışma Zamanı türleri şu şekilde kullanılabilir:

  • Bir bileşende kullanıcı tanımlı interface class genel bir kullanıcının Windows meta veri dosyasına dağıtılmasına izin verilmez; bu nedenle genel erişilebilirliğe sahip olamaz ve diğer .winmd dosyalarındaki istemci kodu bunu uygulayamaz. Aynı bileşendeki genel olmayan başvuru sınıfları tarafından uygulanabilir. Genel başvuru sınıfı, özel üye olarak genel bir arabirim türüne sahip olabilir.

    Aşağıdaki kod parçacığı, bir genel interface class bildirimin nasıl yapıldığını ve ardından bunu özel bir başvuru sınıfında nasıl uygulayıp ref sınıfını genel bir başvuru sınıfında özel üye olarak kullanacağınızı gösterir.

    public ref class MediaFile sealed {};
    
    generic <typename T>
    private interface class  IFileCollection
    {
        property Windows::Foundation::Collections::IVector<T>^ Files;
        Platform::String^  GetFileInfoAsString(T file);
    };
    
    private ref class MediaFileCollection : IFileCollection<MediaFile^>
    {
    public:
        virtual property Windows::Foundation::Collections::IVector<MediaFile^>^ Files;
        virtual Platform::String^  GetFileInfoAsString(MediaFile^ file){return "";}
    };
    
    public interface class ILibraryClient
    {
        bool FindTitle(Platform::String^ title);       
        //...
    };
    
    public ref class MediaPlayer sealed : public IMediaPlayer, public ILibraryClient
    {
    public:
        //IMediaPlayer
        virtual event OnStateChanged^ StateChanged;
        virtual property Platform::String^ CurrentTitle;
        virtual property PlayState CurrentState;
        virtual void Play()
        {
            auto args = ref new MediaPlayerEventArgs(); 
            args->newState = PlayState::Playing;
            args->oldState = PlayState::Stopped;
            StateChanged(this, args);
        }
        virtual void Pause(){/*...*/}
        virtual void Stop(){/*...*/}
        virtual void Forward(float speed){/*...*/}
        virtual void Back(float speed){/*...*/}
    
        //ILibraryClient
        virtual bool FindTitle(Platform::String^ title){/*...*/ return true;}
    
    private:
        MediaFileCollection^ fileCollection;
    
    };
    
  • Genel arabirim, erişilebilirliği, üyeleri yöneten, ilişkiler, temel sınıflar vb. gerektiren standart arabirim kurallarına uymalıdır.

  • Genel arabirim, veya tarafından önce gelen typename classbir veya daha fazla genel tür parametresi alabilir. Türü olmayan parametreler desteklenmez.

  • Tür parametresi herhangi bir Windows Çalışma Zamanı türü olabilir. Başka bir ifadeyle tür parametresi bir başvuru türü, değer türü, arabirim sınıfı, temsilci, temel bir tür veya genel sabit listesi sınıfı olabilir.

  • Kapalı genel arabirim, genel bir arabirimden devralan ve tüm tür parametreleri için somut tür bağımsız değişkenlerini belirten bir arabirimdir. Genel olmayan bir özel arabirimin kullanabildiği her yerde kullanılabilir.

  • Açık genel arabirim, henüz somut bir tür sağlanmayan bir veya daha fazla tür parametresine sahip bir arabirimdir. Başka bir genel arabirimin tür bağımsız değişkeni olarak da dahil olmak üzere, bir türün kullanılabildiği her yerde kullanılabilir.

  • Tek tek yöntemleri değil, yalnızca bir arabirimin tamamını parametreleştirebilirsiniz.

  • Tür parametreleri kısıtlanamaz.

  • Kapalı genel arabirim örtük olarak oluşturulmuş bir UUID'ye sahiptir. Kullanıcı UUID belirtemez.

  • Arabirimde, geçerli arabirime (yöntem parametresinde, dönüş değerinde veya özellikte) yapılan tüm başvuruların geçerli örneklemeye başvuracakları varsayılır. Örneğin, IMyIntf, IMyIntf<T> anlamına gelir.

  • Yöntem parametresinin türü bir tür parametresi olduğunda, bu parametrenin veya değişkenin bildirimi herhangi bir işaretçi, yerel başvuru veya tanıtıcı bildirimcisi olmadan tür parametresinin adını kullanır. Başka bir deyişle, asla "T^" yazmazsınız.

  • Şablonlu başvuru sınıfları özel olmalıdır. Genel arabirimler uygulayabilir ve şablon parametresi T'yi genel bağımsız değişken T'ye geçirebilir. Şablonlu bir başv sınıfının her örneği bir başv sınıfıdır.

Ayrıca bkz.

Tür Sistemi
C++/CX Dil Başvurusu
Ad Alanları Başvurusu