Aracılığıyla paylaş


Genel Arabirimler (C++/CLI)

Sınıflardaki tür parametrelerine uygulanan kısıtlamalar, arabirimlerdeki tür parametrelerine uygulananlarla aynıdır (bkz . Genel Sınıflar (C++/CLI)).

İşlev aşırı yüklemesini denetleen kurallar, genel sınıflar veya genel arabirimler içindeki işlevler için aynıdır.

Açık arabirim üyesi uygulamaları, basit arabirim türleriyle aynı şekilde oluşturulmuş arabirim türleriyle çalışır (aşağıdaki örneklere bakın).

Arabirimler hakkında daha fazla bilgi için bkz . arabirim sınıfı.

Sözdizimi

[attributes] generic <class-key type-parameter-identifier[, ...]>
[type-parameter-constraints-clauses][accesibility-modifiers] interface class identifier [: base-list] {   interface-body} [declarators] ;

Açıklamalar

Öznitelik
(İsteğe bağlı) Ek bildirim bilgileri. Öznitelikler ve öznitelik sınıfları hakkında daha fazla bilgi için bkz . Öznitelikler.

class-key
class veya typename

type-parameter-identifier(lar)
Virgülle ayrılmış tanımlayıcılar 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 (örn. genel, özel).

identifier
Arabirim adı.

temel liste
(İsteğe bağlı) Virgülle ayrılmış bir veya daha fazla açık temel arabirim içeren liste.

arabirim gövdesi
Arabirim üyelerinin bildirimleri.

Declarators
(İsteğe bağlı) Bu türe dayalı değişkenlerin bildirimleri.

Örnek: Genel arabirim bildirme ve örneği oluşturma

Aşağıdaki örnekte genel bir arabirim bildirme ve örneği oluşturma işlemleri gösterilmektedir. Örnekte genel arabirim IList<ItemType> bildirilir. Daha sonra iki genel sınıf List1<ItemType> tarafından uygulanır ve List2<ItemType>farklı uygulamalarla.

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

// An exception to be thrown by the List when
// attempting to access elements beyond the
// end of the list.
ref class ElementNotFoundException : Exception {};

// A generic List interface
generic <typename ItemType>
public interface class IList {
   ItemType MoveFirst();
   bool Add(ItemType item);
   bool AtEnd();
   ItemType Current();
   void MoveNext();
};

// A linked list implementation of IList
generic <typename ItemType>
public ref class List1 : public IList<ItemType> {
   ref class Node {
      ItemType m_item;

   public:
      ItemType get_Item() { return m_item; };
      void set_Item(ItemType value) { m_item = value; };

      Node^ next;

      Node(ItemType item) {
         m_item = item;
         next = nullptr;
      }
   };

   Node^ first;
   Node^ last;
   Node^ current;

   public:
   List1() {
      first = nullptr;
      last = first;
      current = first;
   }

   virtual ItemType MoveFirst() {
      current = first;
      if (first != nullptr)
        return first->get_Item();
      else
         return ItemType();
   }

   virtual bool Add(ItemType item) {
      if (last != nullptr) {
         last->next = gcnew Node(item);
         last = last->next;
      }
      else {
         first = gcnew Node(item);
         last = first;
         current = first;
      }
      return true;
   }

   virtual bool AtEnd() {
      if (current == nullptr )
        return true;
      else
        return false;
   }

   virtual ItemType Current() {
       if (current != nullptr)
         return current->get_Item();
       else
         throw gcnew ElementNotFoundException();
   }

   virtual void MoveNext() {
      if (current != nullptr)
       current = current->next;
      else
        throw gcnew ElementNotFoundException();
   }
};

// An array implementation of IList
generic <typename ItemType>
ref class List2 : public IList<ItemType> {
   array<ItemType>^ item_array;
   int count;
   int current;

   public:

   List2() {
      // not yet possible to declare an
      // array of a generic type parameter
      item_array = gcnew array<ItemType>(256);
      count = current = 0;
   }

   virtual ItemType MoveFirst() {
      current = 0;
      return item_array[0];
   }

   virtual bool Add(ItemType item) {
      if (count < 256)
         item_array[count++] = item;
      else
        return false;
      return true;
   }

   virtual bool AtEnd() {
      if (current >= count)
        return true;
      else
        return false;
   }

   virtual ItemType Current() {
      if (current < count)
        return item_array[current];
      else
        throw gcnew ElementNotFoundException();
   }

   virtual void MoveNext() {
      if (current < count)
         ++current;
      else
         throw gcnew ElementNotFoundException();
   }
};

// Add elements to the list and display them.
generic <typename ItemType>
void AddStringsAndDisplay(IList<ItemType>^ list, ItemType item1, ItemType item2) {
   list->Add(item1);
   list->Add(item2);
   for (list->MoveFirst(); ! list->AtEnd(); list->MoveNext())
   Console::WriteLine(list->Current());
}

int main() {
   // Instantiate both types of list.

   List1<String^>^ list1 = gcnew List1<String^>();
   List2<String^>^ list2 = gcnew List2<String^>();

   // Use the linked list implementation of IList.
   AddStringsAndDisplay<String^>(list1, "Linked List", "List1");

   // Use the array implementation of the IList.
   AddStringsAndDisplay<String^>(list2, "Array List", "List2");
}
Linked List
List1
Array List
List2

Örnek: Genel arabirim bildirme

Bu örnek, bir genel arabirim, IMyGenIfaceve ile konusunda uzmanlaşmış IMyGenIfaceiki genel olmayan arabirim IMySpecializedIntImySpecializedStringbildirir. İki özel arabirim daha sonra iki sınıf MyIntClass ve MyStringClasstarafından uygulanır. Örnek, genel arabirimleri özelleştirmeyi, genel ve genel olmayan arabirimleri başlatmayı ve arabirimlerde açıkça uygulanan üyeleri çağırmayı gösterir.

// generic_interface2.cpp
// compile with: /clr
// Specializing and implementing generic interfaces.
using namespace System;

generic <class ItemType>
public interface class IMyGenIface {
   void Initialize(ItemType f);
};

public interface class IMySpecializedInt: public IMyGenIface<int> {
   void Display();
};

public interface class IMySpecializedString: public IMyGenIface<String^> {
   void Display();
};

public ref class MyIntClass: public IMySpecializedInt {
   int myField;

public:
   virtual void Initialize(int f) {
      myField = f;
   }

   virtual void Display() {
      Console::WriteLine("The integer field contains: {0}", myField);
   }
};

public ref struct MyStringClass: IMySpecializedString {
   String^ myField;

public:
   virtual void Initialize(String^ f) {
      myField = f;
    }

   virtual void Display() {
      Console::WriteLine("The String field contains: {0}", myField);
   }
};

int main() {
   // Instantiate the generic interface.
   IMyGenIface<int>^ myIntObj = gcnew MyIntClass();

   // Instantiate the specialized interface "IMySpecializedInt."
   IMySpecializedInt^ mySpIntObj = (IMySpecializedInt^) myIntObj;

   // Instantiate the generic interface.
   IMyGenIface<String^>^ myStringObj = gcnew MyStringClass();

   // Instantiate the specialized interface "IMySpecializedString."
   IMySpecializedString^ mySpStringObj =
            (IMySpecializedString^) myStringObj;

   // Call the explicitly implemented interface members.
   myIntObj->Initialize(1234);
   mySpIntObj->Display();

   myStringObj->Initialize("My string");
   mySpStringObj->Display();
}
The integer field contains: 1234
The String field contains: My string

Ayrıca bkz.

Genel Türler