C # LinqExtensions implementa l'ereditarietà multipla

0

Secondo WikiPedia

"Alcuni linguaggi non supportano i mixaggi a livello di lingua, ma possono facilmente imitarli copiando metodi da un oggetto all'altro in fase di runtime, quindi" prendendo in prestito "i metodi del mixin. Nota che questo è possibile anche con lingue tipizzate in modo statico, ma richiede la costruzione di un nuovo oggetto con il set esteso di metodi. "

1) Le funzioni di libreria statica di LinqExtensions (.Where ()) applicate alle raccolte di oggetti regolari (int []) che implementano IEnumerable fanno essenzialmente questo. Usano un nuovo oggetto (LinqExtensions) per aggiungere il set esteso di metodi (Where (), ecc.)

Conclusione. LinqExtensions sono mixins con tutte le classi che supportano IEnumerable.

2) Secondo WikiPedia

"Nei linguaggi di programmazione orientati agli oggetti, un mixin è una classe che contiene una combinazione di metodi di altre classi.Quando tale combinazione viene eseguita dipende dalla lingua, ma non è dall'ereditarietà.Se una combinazione contiene tutti i metodi di combinazione classi è equivalente all'ereditarietà multipla. "

Miscelando i ALL metodi delle classi che supportano IEnumerable (List.HashCode, List.ToString, altre funzionalità di base della gerarchia di elenchi), con i metodi ALL dalla libreria statica LinqExtensions (.Where (), Max (), ecc.) viene prodotto un equivalente all'ereditarietà .

Viene prodotto un equivalente all'ereditarietà multipla, sì o no?

    
posta Andyz Smith 23.11.2013 - 20:01
fonte

1 risposta

3

No.

I metodi non sono aggiunti a IEnumerable ma sono disponibili solo se il tipo LinqExtensions rientra nell'ambito. Ciò significa che in alcune parti del codice .Where e i suoi parenti sono disponibili, e alcune parti sono non .

Per i mix-in in stile Scala i metodi fanno parte del tipo misto e in quanto tali sono disponibili indipendentemente dall'ambito e possono partecipare ai controlli sottotipo.

Inoltre, un comportamento necessario per qualcosa che deve essere chiamato ereditarietà multipla implica l'ereditarietà effettiva. Se si dispone di due metodi di estensione, uno per IEnumerable e uno per List , non si verifica alcuna distribuzione di runtime effettiva. Se hai un List , quale metodo di estensione è invocato dipende interamente dal tipo in fase di compilazione della variabile.

Oltre a ciò, i metodi di estensione non possono estendere lo stato dell'oggetto che estendono (senza hack ingloriosi). Quando le persone parlano di ereditarietà, in genere assumono che è possibile aggiungere variabili a una classe di riferimento durante l'ereditarietà.

Quindi no - i metodi di estensione non sono in alcun modo significativo un'equivalenza all'ereditarietà multipla.

    
risposta data 23.11.2013 - 20:47
fonte

Leggi altre domande sui tag