C ++ / CLI: Implementando IList e IList (implementação explícita de um indexador padrão)
-
22-08-2019 - |
Pergunta
Eu estou tentando implementar um C ++ / CLI classe que implementa tanto IList
e IList<T>
.
Uma vez que eles têm sobreposição de nomes, eu tenho que implementar um deles explicitamente, e a escolha natural deve ser IList.
A implementação implícita do indexador é:
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);
}
}
Agora estou tentando declarar o indexador padrão para IList.
Meu palpite seria algo como isto:
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);
}
mas isso só me dá
Erro C2061: erro de sintaxe: identificador 'default'
Alguma dica?
Solução
JaredPar é responder quase funcionou. Duas coisas devem ser alterados:
- O indexador-propriedade precisa de um nome diferente, pois "default" já está tomada pela implementação implícita.
- A especificação das necessidades imperiosas de ser feito no set e get-métodos, não na própria propriedade.
ou seja:.
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;
}
Outras dicas
não têm feito uma série de interfaces em C ++ / CLI, mas este parece ser coberta 8.8.10.1 do C ++ / CLI especificação . Eu acredito que o recurso que você está procurando é primordial explícito. Neste você deve especificar o membro implementada após a definição assim.
property Object^ default[int] = System::Collections::IList::default {... }
Eu compilei uma classe implementando IList<T>
explicitamente escrito em C # e abriu-a com refletor e desmontado para 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)
{
//
}
Mas isso não compilar: get_Item
, set_Item
não é membro de IList<T>
;