Udostępnij za pośrednictwem


Ograniczenia rodzajowy wpisz parametry (C + +/ CLI)

W deklaracji typ ogólny lub metoda kwalifikują się typ parametr z ograniczeniami.ograniczenie jest wymóg, by muszą spełniać typów używanych jako argumentów typu.Na przykład może być ograniczenie , że typ argument musi implementować niektórych interfejs lub dziedziczą z klasy określonej.

Warunki ograniczające są opcjonalne; nie określając ograniczenie na parametr jest równoważne ograniczenia parametr do Object.

where type-parameter: constraint list

Parametry

  • Typparametr
    Jeden z parametrów typu będą ograniczane.

  • Lista ograniczenie
    ograniczenie listy jest rozdzielana przecinkami lista ograniczenie specyfikacji.Wykaz może zawierać interfejsy, które mają być realizowane przez typ parametr.

    Wykaz może również zawierać klasy.Typ argument do zaspokojenia klasy bazowej ograniczeniemusi być tej samej klasy co ograniczenie lub pochodzić od ograniczenie.

    Można również określić gcnew() do wskazania typu argument musi mieć publicznego domyślnego konstruktor; lub ref class do wskazania typu argument musi być typ referencyjny, włącznie z wszelkimi klasy, interfejs, delegat, typ tablicy; lub value class do określenia typu argument musi być typ wartości.Dowolny typ wartości , z wyjątkiem Nullable <T> może być określony.

    Rodzajowy parametr można również określić jako ograniczenie.Typ argument dostarczone dla danego typu, które są ograniczenia muszą być lub pochodzić od typu ograniczenie.Jest to typ owies ograniczenie.

Uwagi

Klauzula ograniczenie składa się z gdzie następuje typu parametr, dwukropek (:) i ograniczenie, która określa rodzaj ograniczenia typu parametr.gdy jest kontekst-słowa kluczowego wrażliwe; zobacz Kontekstowe słowa kluczowe (C++ Component Extensions) Aby uzyskać więcej informacji.Wiele oddzielnych gdzie klauzul ze spacją.

Ograniczenia są stosowane do wpisz parametry, aby umieścić ograniczenia na typy, które mogą być używane jako argumenty typ ogólny lub metoda.

Ograniczenia klasy i interfejs określić, że typy argument muszą być lub dziedziczą z określonej klasy lub wykonania określonego interfejs.

Stosowania ograniczeń w odniesieniu do typ ogólny lub metoda umożliwia kodu w tego typu lub metoda , aby skorzystać z funkcji znanych typów ograniczonego.Na przykład, można zadeklarować rodzajowego klasy takie, że typ parametr implementuje **IComparable <T>**interfejs:

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

Wymaga to ograniczenie , że typ argument używany dla T implementuje IComparable<T> w czasie kompilować .Umożliwia także metody interfejs , takich jak CompareTo, ma być wywoływana.Brak rzutu jest potrzebne na wystąpienie typu parametr do wywołania metody interfejs .

Metody statyczne klasy typ argumentnie może być wywołana przez typ parametr; one mogą być wywoływane tylko przez rzeczywisty typ nazwany.

ograniczenie nie może być typ wartości, tym wbudowanych typów, takie jak int lub double.Ponieważ typów wartości nie może mieć pochodne klasy, tylko jedna klasa kiedykolwiek będzie mógł spełniać ograniczenie.W takim przypadku można zapisać rodzajową z typu parametr zastępuje określonego typ wartości.

Ograniczenia są wymagane w niektórych przypadkach, ponieważ kompilator nie pozwoli stosowania metod lub inne funkcje nieznany typ chyba, że ograniczenia zakłada, że nieznany typ obsługuje metody lub interfejsów.

Rozdzielana przecinkami lista można określić wiele ograniczeń dla tego samego typu parametr

// 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 {};

Z wielu parametrów typu, należy skorzystać z jednej gdzie klauzuli dla każdego typu parametr.Na przykład:

// 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 {};

Podsumowując, użyj ograniczeń w kodzie, zgodnie z następującymi zasadami:

  • Jeśli wymieniono wiele ograniczeń, ograniczenia mogą być wymienione w dowolnej kolejności.

  • Ograniczenia mogą być również typu klasy, takie jak abstrakcyjne klasy podstawowej.Jednakże ograniczenia nie może być typów wartości lub klasy zapieczętowanej.

  • Same ograniczenia nie może być typu parametry, ale może pociągnąć za sobą parametrów typu czcionką, otwarty zbudowane.Na przykład:

    // 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{};
    

Przykład

Następujący przykład demonstruje użycie ograniczenia do wywołania metody instancji na parametrów typu.

// 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");
}
  

typ ogólnyparametr jest używany jako ograniczenie, jest o nazwie nagi typ ograniczenie. Typ owies ograniczenia są przydatne, gdy Członkowskie funkcja z własnych typ parametr musi ograniczyć tego parametr typu parametr typu zawierające.

W poniższym przykładzie t jest typ owies ograniczenie w kontekst Dodaj metoda.

Ograniczenia typu bez nadruku można również w definicji klasą rodzajową.Przydatność ograniczenia typu nagi z klas rodzajowych jest ograniczona, ponieważ kompilator może przyjmować nic o nieosłoniętym typu ograniczenie , chyba że pochodzi ona od Object.Użyj ograniczeń typ owies klas rodzajowych w scenariuszach, w których chcesz wymusić na dziedziczenie relacja między dwoma parametrów typu.

// 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 {};

Zobacz też

Inne zasoby

Typy ogólne (C++ Component Extensions)