Genel Temsilciler (C++/CLI)
Temsilcilerle genel tür parametreleri kullanabilirsiniz. Temsilciler hakkında daha fazla bilgi için bkz . temsilci (C++/CLI ve C++/CX).
Sözdizimi
[attributes]
generic < [class | typename] type-parameter-identifiers>
[type-parameter-constraints-clauses]
[accessibility-modifiers] delegate result-type identifier
([formal-parameters]);
Parametreler
Öznitelik
(İsteğe bağlı) Ek bildirim bilgileri. Öznitelikler ve öznitelik sınıfları hakkında daha fazla bilgi için bkz. Öznitelikler.
type-parameter-identifier(lar)
Tür parametreleri için tanımlayıcıların virgülle ayrılmış listesi.
type-parameter-constraints-yan tümceleri
Genel Tür Parametrelerindeki Kısıtlamalar (C++/CLI) içinde belirtilen formu alır
erişilebilirlik değiştiricileri
(İsteğe bağlı) Erişilebilirlik değiştiricileri (ör. public
, private
).
sonuç türü
Temsilcinin dönüş türü.
identifier
Temsilcinin adı.
formal-parameters
(İsteğe bağlı) Temsilcinin parametre listesi.
Örnekler
Temsilci türü parametreleri, temsilci nesnesinin oluşturulduğu noktada belirtilir. Hem temsilci hem de onunla ilişkilendirilmiş yöntem aynı imzaya sahip olmalıdır. Aşağıda genel bir temsilci bildirimi örneği verilmiştir.
// generics_generic_delegate1.cpp
// compile with: /clr /c
generic <class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
Aşağıdaki örnekte,
Aynı temsilci nesnesini farklı türlerde kullanamazsınız. Farklı türler için farklı temsilci nesneleri oluşturun.
Genel bir temsilci genel bir yöntemle ilişkilendirilebilir.
Tür bağımsız değişkenleri belirtilmeden genel bir yöntem çağrıldığında, derleyici çağrı için tür bağımsız değişkenlerini çıkarsamaya çalışır.
// 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>);
}
Aşağıdaki örnek, genel bir temsilci GenDelegate<ItemType>
bildirir ve bunu type parametresini ItemType
kullanan yöntemle MyMethod
ilişkilendirerek örneği oluşturur. Temsilcinin iki örneği (bir tamsayı ve bir çift) oluşturulur ve çağrılır.
// 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