Domanda

Mi capita spesso di dover attuare alcune interfacce come IEnumerable<T> nel mio codice.

Ogni volta che, in sede di attuazione automaticamente, ho incontrato il seguente:

public IEnumerator<T> GetEnumerator() {
    // Code here...
}

public IEnumerator GetEnumerator1() {
    // Code here...
}

Anche se devo implementare sia GetEnumerator () metodi, che incredibilmente possono avere lo stesso nome, anche se ci rendiamo conto che lo fanno lo stesso, in qualche modo. Il compilatore non li può trattare come uno essendo sovraccarico dell'altro, perché solo differisce tipo di ritorno.

Nel fare ciò, riesco a impostare la funzione di accesso GetEnumerator1() a private. In questo modo, il compilatore non lo fa denuncia di non attuare il membro di interfaccia, e ho semplicemente gettare un NotImplementedException all'interno del corpo del metodo.

Tuttavia, mi chiedo se è una pratica buona, o se passerò in modo diverso, come forse un metodo alias o qualcosa del genere così.

Qual è l'approccio migliore durante l'implementazione di un'interfaccia come IEnumerable<T> che richiede l'attuazione di due metodi diversi con lo stesso nome?

Modifica # 1

fa VB.NET reagisce in modo diverso da C #, implementando interfacce, poiché in VB.NET è esplicitamente attuata, costringendo così il GetEnumerator1(). Ecco il codice:

Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator
    // Code here...
End Function

Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator
    // Code here...
End Function

Entrambi i metodi sono esplicitamente GetEnumerator() implementato, e la compilazione rifiuterà loro di avere lo stesso nome. Perché?

È stato utile?

Soluzione

In Visual Basic, tutte le implementazioni di interfaccia sono espliciti .

mappature di interfaccia sono definiti dalla Implements dichiarazione in modo da poter assegnare un nome alle modalità di attuazione di interfaccia quello che vuoi. (A differenza di C #, dove i deduce compilatore che metodi implementano interfacce facendo corrispondere i loro nomi e le firme.)

Modifica del nome del metodo e la visibilità (a seconda dei casi) è una pratica standard in VB. per una panoramica buona Vedere implementazione delle interfacce in VB.NET .

Altri suggerimenti

È possibile utilizzare :

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
    ...
}

Si dovrebbe essere in grado di utilizzare Implementazioni esplicite dell'interfaccia per creare i due metodi che hanno la stessa firma. A seconda di ciò che si sta enumerazione, vorrei solo passare attraverso queste chiamate a un IEnumerable<T> interna, come una lista o un array.

L'implementazione dell'interfaccia non generico permette esplicitamente entrambi i metodi per avere lo stesso nome, e permette la versione non generica da attuare in termini di quello generico. Lungo le linee di:

public class TestEnumerable : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        // Type-safe implementation here.
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top