Domanda

domanda simile ma non proprio la stessa cosa

Stavo pensando che, con metodi di estensione nello stesso spazio dei nomi come interfaccia si potrebbe ottenere un effetto simile a ereditarietà multipla nel senso che non c'è bisogno di avere il codice duplicato attuazione della stessa interfaccia allo stesso modo in 10 classi diverse.

Quali sono alcuni degli aspetti negativi di fare questo? Credo che i pro sono abbastanza evidenti, sono i contro che di solito tornare a mordere voi più tardi.

Uno dei svantaggi che vedo è che i metodi di estensione non può essere virtuale, quindi è necessario essere sicuri che in realtà si vuole farli eseguire allo stesso modo per ogni istanza.

Nessuna soluzione corretta

Altri suggerimenti

Il problema che vedo dotata di sistema di interfaccia dell'edificio tramite metodi di estensione è che si sta più effettivamente implementa l'interfaccia e quindi non è possibile utilizzare l'oggetto come il tipo di interfaccia.

che ho un metodo che prende un oggetto di tipo IBar. Se a implementare l'interfaccia IBar su Foo classe tramite metodi di estensione, quindi Foo non deriva da IBar e non può essere usato in modo intercambiabile con esso (Liskov principio di sostituzione). Certo, ho il comportamento che voglio aggiunto alla Foo, ma perdo l'aspetto più importante della creazione di interfacce, in primo luogo - essere in grado di definire un contratto di astratto che può essere implementato in una varietà di modi da varie classi in modo che classi dipendenti non devono conoscere implementazioni concrete.

Se avevo bisogno di ereditarietà multipla (e finora ho vissuto senza di essa) abbastanza male, credo che userei composizione, invece di ridurre al minimo la quantità di duplicazione del codice.

Un modo decente per pensare a questo è che i metodi di istanza sono qualcosa di fatto da l'oggetto, mentre i metodi di estensione sono fatto qualcosa di a l'oggetto. Sono abbastanza certo che i design Framework Guidelines dico è necessario implementare un metodo di istanza, quando possibile.

Un'interfaccia dichiara "I care sull'utilizzo di questa funzionalità, ma non come si è compiuto." Che lascia implementatori la libertà di scegliere il come. Esso disaccoppia l'intento, un'API pubblica, dal meccanismo, una classe con il codice di cemento.

Dato che questo è il vantaggio principale di interfacce, la loro attuazione interamente come metodi di estensione sembra per sconfiggere il loro scopo. Anche IEnumerable<T> ha un metodo di istanza.

Modifica : Inoltre, gli oggetti sono destinati ad agire per i dati che contengono. metodi di estensione possono vedere solo API pubblica di un oggetto (come sono solo metodi statici); si dovrà esporre tutti i stato di un oggetto per farlo funzionare (un OO no-no).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top