Aracılığıyla paylaş


Genel tür parametrelerindeki kısıtlamalar (C++/CLI)

Genel tür veya yöntem bildirimlerinde, tür parametresini kısıtlamalarla niteleyebilirsiniz. Kısıtlama, tür bağımsız değişkenleri olarak kullanılan türlerin karşılaması gereken bir gereksinimdir. Örneğin, tür bağımsız değişkeninin belirli bir arabirim uygulaması veya belirli bir sınıftan devralması gerekebilir.

Kısıtlamalar isteğe bağlıdır; bir parametrede kısıtlama belirtilmemesi, kısıtlama kullanmaya Object eşdeğerdir.

Sözdizimi

where type-parameter : constraint-list

Parametreler

type-parameter
Kısıtlanmış parametre tanımlayıcıları türünden biri.

constraint-list
Kısıtlama belirtimlerinin virgülle ayrılmış listesi. Liste, tarafından type-parameteruygulanacak arabirimleri içerebilir.

Liste bir sınıf da içerebilir. Bir temel sınıf kısıtlamasını karşılamak için tür bağımsız değişkeninin kısıtlamayla aynı sınıf olması veya kısıtlamadan türetilmesi gerekir. Tür bağımsız değişkeninin herhangi classbir , interface, delegateveya array türü de dahil olmak üzere bir başvuru türü olması gerektiğini belirtmek için belirtinref class. Tür bağımsız değişkeninin bir değer türü olması gerektiğini belirtmek için belirtin value class . Dışında Nullable<T> herhangi bir değer türü belirtilebilir.

Tür bağımsız değişkeninin genel parametresiz oluşturucuya sahip olması gerektiğini belirtmek için de belirtebilirsiniz gcnew() .

Kısıtlama olarak genel bir parametre de belirtebilirsiniz. Kısıtladığınız tür için sağlanan tür bağımsız değişkeni kısıtlama türünden türetilmelidir. Bu parametre çıplak tür kısıtlaması olarak adlandırılır.

Açıklamalar

constraint yan tümcesi where , ardından tür parametresi, iki nokta üst üste (): ve tür parametresi üzerindeki kısıtlamanın doğasını belirten kısıtlamadan oluşur. where bağlama duyarlı bir anahtar sözcüktür. Daha fazla bilgi için bkz . Bağlama duyarlı anahtar sözcükler. Birden çok where yan tümceyi boşlukla ayırın.

Kısıtlamalar, genel bir tür veya yöntem için bağımsız değişken olarak kullanılabilecek türlere sınırlamalar getirmek için tür parametrelerine uygulanır.

Sınıf ve arabirim kısıtlamaları, bağımsız değişken türlerinin belirtilen bir sınıftan olması veya devralması ya da belirtilen arabirimi uygulaması gerektiğini belirtir.

Kısıtlamaların genel bir türe veya yönteme uygulanması, bu tür veya yöntemdeki kodun kısıtlanmış türlerin bilinen özelliklerinden yararlanmasına olanak tanır. Örneğin, tür parametresi arabirimini uygulayan IComparable<T> genel bir sınıf bildirebilirsiniz:

// generics_constraints_1.cpp
// compile with: /c /clr
using namespace System;
generic <typename T>
where T : IComparable<T>
ref class List {};

Bu kısıtlama için T kullanılan bir tür bağımsız değişkeninin derleme zamanında uygulanmasını IComparable<T> gerektirir. Ayrıca gibi CompareToarabirim yöntemlerinin çağrılmasını sağlar. Arabirim yöntemlerini çağırmak için tür parametresi örneğinde atama gerekmez.

Tür bağımsız değişkeninin sınıfındaki statik yöntemler tür parametresi aracılığıyla çağrılamıyor; bunlar yalnızca gerçek adlandırılmış tür aracılığıyla çağrılabilir.

Kısıtlama, veya doublegibi int yerleşik türler de dahil olmak üzere bir değer türü olamaz. Değer türleri türetilmiş sınıflara sahip olmadığından yalnızca bir sınıf kısıtlamayı karşılayabilir. Bu durumda, genel, tür parametresi belirli bir değer türüyle değiştirilerek yeniden yazılabilir.

Bazı durumlarda, derleyici bilinmeyen türün yöntemleri veya arabirimleri desteklediğini ima etmediği sürece bilinmeyen türdeki yöntemlerin veya diğer özelliklerin kullanılmasına izin vermediğinden kısıtlamalar gereklidir.

Virgülle ayrılmış bir listede aynı tür parametresi için birden çok kısıtlama belirtilebilir

// generics_constraints_2.cpp
// compile with: /c /clr
using namespace System;
using namespace System::Collections::Generic;
generic <typename T>
where T : List<T>, IComparable<T>
ref class List {};

Birden çok tür parametresiyle, her tür parametresi için bir where yan tümcesi kullanın. Örneğin:

// generics_constraints_3.cpp
// compile with: /c /clr
using namespace System;
using namespace System::Collections::Generic;

generic <typename K, typename V>
   where K: IComparable<K>
   where V: IComparable<K>
ref class Dictionary {};

Aşağıdaki kurallara göre kodunuzda kısıtlamaları kullanın:

  • Birden çok kısıtlama listeleniyorsa, kısıtlamalar herhangi bir sırada listelenebilir.

  • Kısıtlamalar, soyut temel sınıflar gibi sınıf türleri de olabilir. Ancak, kısıtlamalar değer türleri veya sealed sınıflar olamaz.

  • Kısıtlamalar kendileri tür parametreleri olamaz, ancak tür parametrelerini açık bir yapı türüne dahil edebilir. Örneğin:

    // generics_constraints_4.cpp
    // compile with: /c /clr
    generic <typename T>
    ref class G1 {};
    
    generic <typename Type1, typename Type2>
    where Type1 : G1<Type2>   // OK, G1 takes one type parameter
    ref class G2{};
    

Örnekler

Aşağıdaki örnek, tür parametrelerinde örnek yöntemlerini çağırmak için kısıtlamaların kullanılmasını gösterir.

// generics_constraints_5.cpp
// compile with: /clr
using namespace System;

interface class IAge {
   int Age();
};

ref class MyClass {
public:
   generic <class ItemType> where ItemType : IAge
   bool isSenior(ItemType item) {
      // Because of the constraint,
      // the Age method can be called on ItemType.
      if (item->Age() >= 65)
         return true;
      else
         return false;
   }
};

ref class Senior : IAge {
public:
   virtual int Age() {
      return 70;
   }
};

ref class Adult: IAge {
public:
   virtual int Age() {
      return 30;
   }
};

int main() {
   MyClass^ ageGuess = gcnew MyClass();
   Adult^ parent = gcnew Adult();
   Senior^ grandfather = gcnew Senior();

   if (ageGuess->isSenior<Adult^>(parent))
      Console::WriteLine("\"parent\" is a senior");
   else
      Console::WriteLine("\"parent\" is not a senior");

   if (ageGuess->isSenior<Senior^>(grandfather))
      Console::WriteLine("\"grandfather\" is a senior");
   else
      Console::WriteLine("\"grandfather\" is not a senior");
}
"parent" is not a senior
"grandfather" is a senior

Genel tür parametresi kısıtlama olarak kullanıldığında, buna çıplak tür kısıtlaması denir. Çıplak tür kısıtlamaları, kendi tür parametresine sahip bir üye işlevinin bu parametreyi içeren türün tür parametresiyle sınırlaması gerektiğinde yararlıdır.

Aşağıdaki örnekte, T yöntemi bağlamında çıplak tür kısıtlaması verilmiştir Add .

Çıplak tür kısıtlamaları genel sınıf tanımlarında da kullanılabilir. Genel sınıflarla çıplak tür kısıtlamalarının kullanışlılığı sınırlıdır, çünkü derleyici bir çıplak tür kısıtlaması hakkında hiçbir şey varsayamaz, ancak bu kısıtlamadan Objecttüretilir. İki tür parametresi arasında devralma ilişkisini zorlamak istediğiniz senaryolarda genel sınıflarda çıplak tür kısıtlamaları kullanın.

// generics_constraints_6.cpp
// compile with: /clr /c
generic <class T>
ref struct List {
   generic <class U>
   where U : T
   void Add(List<U> items)  {}
};

generic <class A, class B, class C>
where A : C
ref struct SampleClass {};

Ayrıca bkz.

Genel Türler