Mensintesis antarmuka (MIDL 3.0)
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.
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
.
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, danactivatable
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
{
...
}
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
{
}
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, danstatics
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
{
}
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, danprotected
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
{
}
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, danoverridable
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
{
}