Mensintesis antarmuka (MIDL 3.0)

Menetapkan anggota ke antarmuka

Kelas Windows Runtime beroperasi dalam hal antarmuka. Antarmuka hampir tidak disebutkan di sebagian besar contoh sebelumnya, karena biasanya merupakan detail implementasi yang tidak perlu Anda kontrol dalam banyak kasus.

Akibatnya, ketika deskripsi kelas Anda tidak mereferensikan antarmuka—tetapi ketika diperlukan untuk mengimplementasikan kelas —pengkompilasi MIDL 3.0 mensintesis dan menambahkannya, seperlunya.

Konstruktor default

Saat Anda mendeklarasikan konstruktor default sebagai anggota kelas, pengkompilasi menghasilkan kelas Windows Runtime yang dapat diaktifkan secara default. Pada tingkat implementasi, ini berarti bahwa metadata menggambarkan kelas sebagai default yang dapat diaktifkan, dan pabrik kelas untuk runtimeclass mengimplementasikan antarmuka IActivationFactory .

runtimeclass Area
{
    Area();
    ...
}

Dalam hal ini, Area dikompilasi dengan metadata [Activatable] dengan Jenisnull.

Konstruktor non-default

Saat Anda mendeklarasikan satu atau beberapa konstruktor non-default sebagai anggota kelas, pengkompilasi menghasilkan kelas Windows Runtime yang dapat diaktifkan, bukan dapat diaktifkan secara default. Pada tingkat implementasi, ini berarti bahwa metadata akan menggambarkan kelas sebagai dapat diaktifkan dan menentukan antarmuka yang berisi metode konstruktor.

Secara default, antarmuka ini diberi nama I<className>Factory, dan pabrik kelas untuk runtimeclass mengimplementasikan antarmuka tersebut. Jika nama antarmuka ini sudah digunakan, pengkompilasi menambahkan akhiran angka bilangan bulat (dimulai dengan 2), hingga menemukan nama yang tidak digunakan.

runtimeclass Area
{
    Area(Int32 width, Int32 height);
    ...
}

Dalam hal ini, pengkompilasi

  • mensintesis antarmuka pabrik bernama IAreaFactory,
  • exclusiveto menambahkan atribut ke antarmuka yang disintesis, menentukan bahwa antarmuka hanya dapat direferensikan oleh kelas runtime, dan
  • activatable menambahkan atribut ke kelas runtime yang menunjukkan bahwa klien dapat menggunakan anggota antarmuka IAreaFactory untuk membuat instans kelas .

Jadi, MIDL di atas dapat ditafsirkan seperti ini.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Kelas mungkin berisi konstruktor default dan konstruktor non-default tambahan.

runtimeclass Area
{
    Area();
    Area(Int32 width, Int32 height);
    ...
}

Dalam hal ini, MIDL dapat ditafsirkan seperti ini; dengan kedua bentuk activatable atribut.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable()]
[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Anggota instans

Dalam contoh di bawah ini, Area memiliki tinggi dan Lebar anggota.

runtimeclass Area : Windows.Foundation.IStringable
{
    Int32 Height;
    Int32 Width;
}

Anggota tersebut bukan bagian dari antarmuka apa pun yang diterapkan Area . Jadi, pengkompilasi mensintesis antarmuka untuk mereka bernama, secara default, I<className>. Jika nama antarmuka ini sudah digunakan, pengkompilasi menambahkan akhiran angka bilangan bulat (dimulai dengan 2), hingga menemukan nama yang tidak digunakan.

Dalam kasus MIDL di atas, pengkompilasi

  • mensintesis antarmuka IArea ,
  • exclusiveto menambahkan atribut ke antarmuka yang disintesis, menentukan bahwa antarmuka hanya dapat direferensikan oleh kelas runtime,
  • menentukan bahwa kelas runtime mengimplementasikan IArea, dan
  • menjadikan antarmuka baru sebagai antarmuka default untuk kelas runtime jika kelas belum memiliki antarmuka default.

Jadi, MIDL di atas dapat ditafsirkan seperti ini.

[exclusiveto(Area)]
interface IArea
{
    Int32 Height;
    Int32 Width;
}

runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}

Anggota statis

Dalam contoh di bawah ini, Area memiliki anggota statis NumberOfAreas.

runtimeclass Area : Windows.Foundation.IStringable
{
    static Int32 NumberOfAreas { get; };
}

Anggota statis bukan bagian dari antarmuka statis apa pun yang diterapkan Area . Jadi, pengkompilasi mensintesis antarmuka untuk itu bernama, secara default, I<className>Statics. Jika nama antarmuka ini sudah digunakan, pengkompilasi menambahkan akhiran angka bilangan bulat (dimulai dengan 2), hingga menemukan nama yang tidak digunakan.

Dalam kasus MIDL di atas, pengkompilasi

  • mensintesis antarmuka IAreaStatics ,
  • exclusiveto menambahkan atribut ke antarmuka yang disintesis, menentukan bahwa antarmuka hanya dapat direferensikan oleh kelas runtime, dan
  • statics menambahkan atribut ke kelas runtime, menentukan bahwa pabrik kelas mengimplementasikan IAreaStatics.

Jadi, MIDL di atas dapat ditafsirkan seperti ini.

[exclusiveto(Area)]
interface IAreaStatics
{
    Int32 NumberOfAreas { get; };
}

[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Anggota yang dilindungi

Dalam contoh di bawah ini, Area memiliki anggota yang dilindungi DoProtectedWork.

runtimeclass Area : Windows.Foundation.IStringable
{
    protected void DoProtectedWork();
}

Anggota yang dilindungi bukan bagian dari antarmuka yang dilindungi yang diterapkan Area . Jadi, pengkompilasi mensintesis antarmuka untuk itu bernama, secara default, I<className>Protected. Jika nama antarmuka ini sudah digunakan, pengkompilasi menambahkan akhiran angka bilangan bulat (dimulai dengan 2), hingga menemukan nama yang tidak digunakan.

Dalam kasus MIDL di atas, pengkompilasi

  • mensintesis antarmuka IAreaProtected ,
  • exclusiveto menambahkan atribut ke antarmuka yang disintesis, menentukan bahwa antarmuka hanya dapat direferensikan oleh kelas runtime, dan
  • protected menambahkan atribut ke kelas runtime, menentukan bahwa kelas mengimplementasikan antarmuka yang dilindungi IAreaProtected.

Jadi, MIDL di atas dapat ditafsirkan seperti ini.

[exclusiveto(Area)]
interface IAreaProtected
{
    void DoProtectedWork();
}

[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Anggota yang dapat diganti

Dalam contoh di bawah ini, Volume (yang berasal dari Area) memiliki anggota doOverridableWork yang dapat diganti.

runtimeclass Volume : Area
{
    overridable void DoOverridableWork();
}

Anggota yang dapat diganti bukan bagian dari antarmuka yang dapat diganti yang diterapkan Area . Jadi, pengkompilasi mensintesis antarmuka untuk itu bernama, secara default, I<className>Overrides. Jika nama antarmuka ini sudah digunakan, pengkompilasi menambahkan akhiran angka bilangan bulat (dimulai dengan 2), hingga menemukan nama yang tidak digunakan.

Dalam kasus MIDL di atas, pengkompilasi

  • mensintesis antarmuka IAreaOverrides ,
  • exclusiveto menambahkan atribut ke antarmuka yang disintesis, menentukan bahwa antarmuka hanya dapat direferensikan oleh kelas runtime, dan
  • overridable menambahkan atribut ke kelas runtime, menentukan bahwa kelas mengimplementasikan antarmuka IAreaOverrides yang dapat diganti.

Jadi, MIDL di atas dapat ditafsirkan seperti ini.

[exclusiveto(Area)]
interface IAreaOverrides
{
    void DoOverridableWork();
}

[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}