다음을 통해 공유


제네릭 형식 매개 변수에 대한 제약 조건(C++/CLI)

제네릭 형식나메서드선언에는 제약 조건이 있는 형식매개 변수를 한정할 수 있습니다.제약 조건은 형식 인수로 사용 되는 형식이 충족 해야 하는 요구 사항이 있습니다.예를 들어제약 조건형식인수특정인터페이스를 구현 하거나 특정클래스에서 상속 해야 하 수 있습니다.

제약 조건은 선택적입니다. 제약 조건매개 변수를 지정 하지 않으면는 해당매개 변수를 제한 하는 것과 Object.

where type-parameter: constraint list

매개 변수

  • 형식매개 변수
    제약을 받게 될 형식 매개 변수를 중 하나입니다.

  • 제약 조건목록
    제약 조건목록 제약 조건사양에 쉼표로 구분 된 목록입니다.목록 형식을매개 변수변수로 구현 해야 하는 인터페이스를 포함할 수 있습니다.

    목록클래스를 포함할 수도 있습니다.기본 클래스제약 조건을 만족 하려면 형식인수에 대 한,이 동일한클래스제약 조건이거나제약 조건에서 파생 되어야 합니다.

    지정할 수도 있습니다 gcnew() 형식인수해야 public 매개 변수가 없는생성자; 나타내기 위해 또는 ref class 형식인수는클래스,인터페이스,대리자또는 배열 형식입니다;를 포함 하는참조 형식이어야 지정 하기 또는 value class 의 형식을 나타내는인수는값 형식이어야 합니다.Null 허용 여부가 <T>을 제외한 모든값 형식 지정할 수 있습니다.

    제네릭매개 변수제약 조건으로 지정할 수도 있습니다.제한 된 형식에 대해 제공 된 형식인수될 하거나제약 조건을 해당 형식에서 파생 해야 합니다.이 naked 형식제약 조건이라고 합니다.

설명

제약 조건절 구성 됩니다 위치 는 형식매개 변수에서 콜론 다음에 (::), 및 제한의 특성매개 변수형식 지정제약 조건,.위치 컨텍스트-중요 한키워드입니다. 참조 하십시오 상황에 맞는 키워드(C++ 구성 요소 확장) 에 대 한 자세한 내용은.여러 구분 위치 절에 공백 사용 합니다.

입력 매개 변수를제네릭 형식또는메서드대 한 인수로 사용할 수 있는 형식에 제한을 둡니다 제약 조건이 적용 됩니다.

클래스 및인터페이스제약 조건인수형식 또는 지정 된클래스에서 상속 하거나 해야 지정 된인터페이스를 구현 하도록 지정 합니다.

제네릭 형식또는메서드제약 조건과응용 프로그램코딩하다에서 해당 형식 또는메서드제약 된 형식의 알려진된 기능을 사용 수 있습니다.형식매개 변수를 구현 하도록 예를 들어, 제네릭클래스선언하다수 있는 **IComparable <T>**인터페이스:

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

이제약 조건형식인수에 사용 한다고 필요 T 을 구현 IComparable<T>컴파일하다타임.인터페이스메서드 또한 같은 있습니다 CompareTo, 호출 될 수 있습니다.캐스트 없음인터페이스메서드를 호출 하려면 형식매개 변수인스턴스를 필요 합니다.

형식매개 변수를 통해클래스형식인수정적 메서드를 호출할 수 없습니다. 이들은 실제 명명 된 형식은 통해 에서만 호출할 수 있습니다.

기본 제공 형식으로 포함 하는값 형식제약 조건수 없습니다 int 또는 이중.값 형식의 파생 클래스를 포함할 수 있으므로 하나의클래스도제약 조건을 충족 하지 됩니다.이대/소문자에 제네릭 특정값 형식으로 형식매개 변수를 다시 작성할 수 있습니다.

제약 조건 제약 조건을 알 수 없는 형식의 메서드 또는 인터페이스를 지원 하는 것을 의미 하지 않는 한컴파일러는 메서드를 사용 하거나 다른 알 수 없는 유형의 기능 수 있습니다 이후 어떤 경우에 필요 합니다.

동일한 형식매개 변수여러 제약 조건은 쉼표로 구분 된 목록에 지정할 수 있습니다.

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

여러 형식 매개 변수를 사용 절을 각 형식매개 변수입니다.예를 들면 다음과 같습니다.

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

요약 하면, 다음 규칙에 따라코딩하다에서 제약 조건을 사용 하십시오.

  • 제약 조건 제약 조건은 여러 개 나열 된 경우 임의의 순서로 나타날 수 있습니다.

  • 추상 기본 클래스와 같은클래스형식 제약 조건은 수도 있습니다.그러나 제약 조건을 봉인 된 클래스 또는 값 형식이 될 수 없습니다.

  • 제약 조건 형식 매개 변수 자체가 수 없습니다 있지만 생성시작됨형식에서 형식 매개 변수가 포함 될 수 있습니다.예를 들면 다음과 같습니다.

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

예제

다음은 제약 조건을 사용 하 여 형식 매개 변수를 인스턴스 메서드를 호출 하는 방법을 보여 줍니다.

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

제네릭 형식매개 변수제약 조건으로 사용 하는 경우는 naked 형식제약 조건이라고 합니다. Naked 형식 제약 조건은 멤버함수는 고유한 형식매개 변수를 해당매개 변수를 포함 형식의 형식매개 변수를 제한 하는 경우에 유용 합니다.

다음 예제에서 T는 Add메서드는컨텍스트는 naked 형식제약 조건입니다.

Naked 형식 제약 조건은 제네릭클래스정의에 사용할 수 있습니다.컴파일러에서 파생 되는 점을 제외 하 고 아무것도 naked 형식제약 조건에 대 한 담당할 수 있으므로 naked 형식 제약 조건과 제네릭 클래스의 유용성이 제한 됩니다 Object.Naked 형식 제약 조건은 제네릭 클래스 형식 매개 변수 사이에 상속관계적용 하려는 경우에 사용 합니다.

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

참고 항목

기타 리소스

제네릭(C++ 구성 요소 확장)