2009-03-27 7 views
4

J'essaye d'implémenter une classe C++/CLI qui implémente à la fois IList et IList<T>.C++/CLI: Implémentation IList et IList <T> (implémentation explicite d'un indexeur par défaut)

Comme ils ont des noms qui se chevauchent, je dois implémenter l'un d'entre eux explicitement, et le choix naturel devrait être IList.

La mise en œuvre implicite de l'indexeur est:

using namespace System::Collections::Generic; 
generic<class InnerT> public ref class MyList : public System::Collections::IList, IList<InnerT> { 
    // ... 
    property InnerT default[int]{ 
    virtual InnerT get(int index); 
    virtual void set(int index, InnerT item); 
    } 
} 

J'essaie maintenant de déclarer l'indexeur par défaut pour IList.

Je dirais quelque chose comme ceci:

property Object^ System::Collections::IList::default[int]{ 
    virtual Object^ System::Collections::IList::get(int index); 
    virtual void System::Collections::IList::set(int index, Object^ item); 
    } 

mais me donne

erreur C2061: erreur de syntaxe: 'default' identifiant

Tous les conseils?

+0

S'il vous plaît changer "implémente IList et IList." à "implémente IList et IList ". –

+0

Merci! Il semble que markdown supprimait le . –

Répondre

4

JaredPar's answer presque travaillé. Deux choses doivent être changées:

  • La propriété indexeur a besoin d'un nom différent puisque "default" est déjà pris par l'implémentation implicite.
  • La spécification du remplacement doit être effectuée sur les méthodes set et get, et non sur la propriété elle-même.

i.e. .:

property Object^ IListItems[int]{ 
    virtual Object^ get(int index) = System::Collections::IList::default::get; 
    virtual void set(int index, Object^ item) = System::Collections::IList::default::set; 
    } 
+1

Également pertinent lors de l'implémentation de l'énumérateur Propriété en cours: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101089 – Crashworks

0

J'ai compilé une classe implémentant IList<T> explicitement écrite en C# et l'ai ouverte avec Reflector et désassemblée en C++/CLI.

T System::Collections::Generic::IList<T>::get_Item(Int32 __gc* index) 
{ 
    // 
} 

void __gc* System::Collections::Generic::IList<T>::set_Item(Int32 __gc* index, T value) 
{ 
    // 
} 

Mais il ne compile pas: get_Item, set_Item est pas membre de IList<T>;

+0

Le réflecteur se désassemble en C++ géré et non en C++/CLI. C++ géré est les anciennes extensions de code managé. Vous pouvez dire par tous les pointeurs __gc. –

+0

Il existe une extension de Reflector qui peut générer C++/CLI. Malheureusement, il a également donné un code incompilable. –

2

N'a pas fait beaucoup d'interfaces en C++/CLI mais cela semble être couvert 8.8.10.1 du C++/CLI spec. Je crois que la fonctionnalité que vous recherchez est un dépassement explicite. Dans ce cas, vous devez spécifier le membre implémenté après la définition.

property Object^ default[int] = System::Collections::IList::default {... } 
Questions connexes