Delegasi Generik (C++/CLI)
Anda dapat menggunakan parameter jenis generik dengan delegasi. Untuk informasi selengkapnya tentang delegasi, lihat delegasi (C++/CLI dan C++/CX).
Sintaks
[attributes]
generic < [class | typename] type-parameter-identifiers>
[type-parameter-constraints-clauses]
[accessibility-modifiers] delegate result-type identifier
([formal-parameters]);
Parameter
Atribut
(Opsional) Informasi deklaratif tambahan. Untuk informasi selengkapnya tentang atribut dan kelas atribut, lihat Atribut.
type-parameter-identifier
Daftar pengidentifikasi yang dipisahkan koma untuk parameter jenis.
type-parameter-constraints-clauses
Mengambil formulir yang ditentukan dalam Batasan pada Parameter Jenis Generik (C++/CLI)
pengubah aksesibilitas
(Opsional) Pengubah aksesibilitas (misalnya public
, private
).
tipe hasil
Jenis pengembalian delegasi.
identifier
Nama delegasi.
parameter formal
(Opsional) Daftar parameter delegasi.
Contoh
Parameter jenis delegasi ditentukan pada titik di mana objek delegasi dibuat. Baik delegasi maupun metode yang terkait dengannya harus memiliki tanda tangan yang sama. Berikut ini adalah contoh deklarasi delegasi generik.
// generics_generic_delegate1.cpp
// compile with: /clr /c
generic <class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
Sampel berikut menunjukkan bahwa
Anda tidak dapat menggunakan objek delegasi yang sama dengan jenis konstruksi yang berbeda. Buat objek delegasi yang berbeda untuk berbagai jenis.
Delegasi generik dapat dikaitkan dengan metode generik.
Ketika metode generik dipanggil tanpa menentukan argumen jenis, pengkompilasi mencoba menyimpulkan argumen jenis untuk panggilan.
// generics_generic_delegate2.cpp
// compile with: /clr
generic <class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
generic <class ItemType>
ref struct MyGenClass {
ItemType MyMethod(ItemType i, ItemType % j) {
return ItemType();
}
};
ref struct MyClass {
generic <class ItemType>
static ItemType MyStaticMethod(ItemType i, ItemType % j) {
return ItemType();
}
};
int main() {
MyGenClass<int> ^ myObj1 = gcnew MyGenClass<int>();
MyGenClass<double> ^ myObj2 = gcnew MyGenClass<double>();
GenDelegate<int>^ myDelegate1 =
gcnew GenDelegate<int>(myObj1, &MyGenClass<int>::MyMethod);
GenDelegate<double>^ myDelegate2 =
gcnew GenDelegate<double>(myObj2, &MyGenClass<double>::MyMethod);
GenDelegate<int>^ myDelegate =
gcnew GenDelegate<int>(&MyClass::MyStaticMethod<int>);
}
Contoh berikut mendeklarasikan delegasi GenDelegate<ItemType>
generik , lalu mengaitkannya dengan mengaitkannya ke metode MyMethod
yang menggunakan parameter ItemType
jenis . Dua instans delegasi (bilangan bulat dan ganda) dibuat dan dipanggil.
// generics_generic_delegate.cpp
// compile with: /clr
using namespace System;
// declare generic delegate
generic <typename ItemType>
delegate ItemType GenDelegate (ItemType p1, ItemType% p2);
// Declare a generic class:
generic <typename ItemType>
ref class MyGenClass {
public:
ItemType MyMethod(ItemType p1, ItemType% p2) {
p2 = p1;
return p1;
}
};
int main() {
int i = 0, j = 0;
double m = 0.0, n = 0.0;
MyGenClass<int>^ myObj1 = gcnew MyGenClass<int>();
MyGenClass<double>^ myObj2 = gcnew MyGenClass<double>();
// Instantiate a delegate using int.
GenDelegate<int>^ MyDelegate1 =
gcnew GenDelegate<int>(myObj1, &MyGenClass<int>::MyMethod);
// Invoke the integer delegate using MyMethod.
i = MyDelegate1(123, j);
Console::WriteLine(
"Invoking the integer delegate: i = {0}, j = {1}", i, j);
// Instantiate a delegate using double.
GenDelegate<double>^ MyDelegate2 =
gcnew GenDelegate<double>(myObj2, &MyGenClass<double>::MyMethod);
// Invoke the integer delegate using MyMethod.
m = MyDelegate2(0.123, n);
Console::WriteLine(
"Invoking the double delegate: m = {0}, n = {1}", m, n);
}
Invoking the integer delegate: i = 123, j = 123
Invoking the double delegate: m = 0.123, n = 0.123