Sdílet prostřednictvím


Omezení parametrů obecných typů (C++/CLI)

V obecný typ nebo metoda prohlášení lze kvalifikovat parametr typu s omezeními.omezení je požadavek, který musí splňovat typy používaných jako argumenty typu.omezení může být například že typ argument musí implementovat určitá rozhraní nebo Zdědit určité třída.

Omezení jsou volitelné. bez zadání omezení na parametr je ekvivalentní nesnaží parametr k Object.

where type-parameter: constraint list

Parametry

  • -typparametr
    Jeden z parametrů typu omezení.

  • seznam omezení
    seznamu omezení je čárkami oddělený seznam omezení specifikace.Seznam může zahrnovat rozhraní implementovaný typ parametr.

    Seznam může též zahrnovat třída.Typ argument splňovat základní třída omezeníji musí být stejné třída jako omezení nebo odvodit z omezení.

    Můžete také určit gcnew() označuje typ argument musí mít veřejný bez parametrů konstruktor; nebo ref class označuje typ argument musí být typu odkazovat se , včetně libovolné třída, rozhraní, delegátnebo typ pole; nebo value class k označení typu argument musí být hodnota.Libovolný hodnota kromě s možnou hodnotou Null <T> může být zadán.

    Můžete také určit Obecné parametr jako omezení.Typ argument pro typ, který se nesnaží musí být nebo je odvozena z typu omezení.To se nazývá holé typu omezení.

Poznámky

Klauzule omezení , která se skládá z kde následuje typ parametr, dvojtečku (:) a omezení, která určuje charakter omezení na typ parametr.kde je kontext-citlivé klíčové slovo; Viz Kontextově závislá klíčová slova (rozšíření komponent C++) Další informace.Oddělit více kde klauzule s mezerou.

Omezení zásad zadejte parametry umístit omezení na typy, které lze použít jako argumenty obecný typ nebo metoda.

Omezení rozhraní třídy a určit, že typy argument musí být nebo dědí ze zadané třída nebo implementují zadané rozhraní.

aplikace omezení obecný typ nebo metoda umožňuje kód v daném typu nebo metoda využít známé funkce vynuceného typy.Například můžete deklarovat obecná třída takové, že implementuje typu parametr **IComparable <T>**rozhraní:

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

Toto omezení vyžaduje, aby typ argument pro T implementuje IComparable<T> v době kompilovat .Umožňuje také metody rozhraní , například CompareTo, která bude volána.Žádné cast je potřebná v instanci typu parametr volání metody rozhraní .

Statické metody typ argument třída nelze volat prostřednictvím typ parametr. může být volána pouze prostřednictvím skutečné pojmenovaného typu.

omezení nemůže být hodnota, včetně předdefinované typy jako int nebo dvojité.Protože typy hodnot nelze odvozených tříd, někdy pouze jedna třída by byl schopen splňovat omezení.V takovém případě obecného mohou být přepsány nahrazuje určitý hodnotatyp parametr .

V některých případech jsou požadovány omezení, protože kompilátor nebude možné použití metod a další funkce Neznámý typ Pokud omezení neznamená, že neznámý typ podporuje rozhraní nebo metod.

Čárkami oddělený seznam, lze určit více omezení pro stejný parametr typu

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

S více parametry typu, použijte jeden kde klauzule pro každý typ parametr.Příklad:

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

Sumarizovat, použijte omezení v kódu podle následujících pravidel:

  • Pokud jsou uvedeny více omezení, omezení může být uvedena v libovolném pořadí.

  • Omezení může být také typy třída jako abstraktní základní třídy.Omezení však nelze typy hodnot nebo uzavřených tříd.

  • Samotné omezení nemůže být parametry typu, ale zahrnují parametry typu v typu otevřený vyrobeno.Příklad:

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

Příklad

Následující příklad ukazuje použití omezení typu volání metody instance.

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

obecný typparametr je použít jako omezení, se nazývá holé typu omezení. Holé typ omezení jsou užitečné, pokud členské funkce s vlastní typ parametr je potřeba omezit typ parametr typ parametr .

V následujícím příkladu je t holé typ omezení v kontext přidat metoda.

Holé typ omezení lze použít také v definicích obecná třída .Užitečnost holé typ omezení obecného třídy je omezena, protože kompilátor může převzít nic o holé typu omezení s výjimkou, že pochází z Object.Pomocí omezení holé typu generic tříd v situacích, ve kterých chcete vynutit dědičnost relace mezi dvěma parametry 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 {};

Viz také

Další zdroje

Obecné typy (rozšíření komponent C++)