2012-03-02 22 views

risposta

12

Gli edifici occupano fessure di dimensioni fisse nello stack (o ovunque si trovino).

Pertanto, non sarebbe possibile eseguire alcun tipo di polimorfismo con le strutture, poiché la struttura derivata sarebbe di dimensioni diverse.

Sarebbe possibile ereditare membri da altre strutture, ma poiché non si è in grado di fare alcun tipo di polimorfismo, non varrebbe la confusione.

+4

Ciò non esclude tuttavia una sintassi dei modelli, che quando si eredita da una struttura, si ottiene una copia di tutti i metodi, proprietà e campi di essa. Non sarebbe un compito compatibile, ma avrebbe lo stesso layout e qualsiasi altra cosa aggiunta nella "discendente". Suppongo che il fatto sia abbastanza, sarebbe confusionario. –

+4

Due parole: affettamento di oggetti. http://en.wikipedia.org/wiki/Object_slicing –

+2

@ LasseV.Karlsen: Esattamente. Se fosse stato supportato, questa domanda sarebbe stata "Perché non posso scrivere' Base b = new Derived() '?" – SLaks

1

NET, se la classe A eredita dal tipo B e un oggetto di tipo A viene passato al codice che prevede un oggetto di tipo B, l'oggetto passato non sarebbe convertito in un B ma rimarrebbe un A. Questo è possibile perché ogni oggetto ha memorizzato con esso un riferimento a un descrittore di tipo. Le classi non hanno alcun descrittore di tipo memorizzato con loro. Se una struttura di tipo A può essere passata per valore a una routine che prevede una struttura di tipo B, la stringa diventa una struttura di tipo B. Nei casi in cui ciò sarebbe sensato, sarebbe più pratico definire un operatore di conversione ampliamento dal tipo A a B.

In alcuni casi potrebbe essere utile passare una struttura di tipo A in riferimento a una routine che prevede il tipo B. Gli operatori di conversione non ci aiuterebbero. Ciò potrebbe tuttavia essere gestito, anche se in modo un po 'goffo, poiché il tipo di struttura A non contiene altro che un campo di tipo B. Tale campo potrebbe quindi essere passato facendo riferimento alla routine che prevede il tipo B; la difficoltà sarebbe che si dovrebbe includere il nome della struttura interna in qualsiasi accesso al campo.

Ciò che sarebbe utile, non solo per le strutture, ma anche per le classi, sarebbe il concetto di "tipo di estensione". Tutte le classi, ereditabili o meno, potrebbero essere estese con un tipo di estensione che includerebbe solo membri di istanze; le variabili oi valori di un tipo di estensione sarebbero considerati come oggetti run-time del tipo base e tutte le conversioni tra i tipi di estensione e i loro tipi di base o tra i tipi di estensione derivati ​​dallo stesso tipo di base sarebbero considerati "allarganti" e sarebbero elaborato come non operativo. L'unico effetto di un tipo di estensione sarebbe quello di portare all'interno dei membri definiti per quel tipo. Questi si comporterebbero in modo simile ai metodi di estensione, tranne che si applicherebbero solo a variabili e variabili dichiarate come tipo di estensione e i membri dei tipi di estensione avrebbero la priorità sui membri della classe base. Si possono immaginare molti usi per tali cose (nei casi in cui si vorrebbe usare i metodi di estensione su alcune istanze di una classe, ma potrebbe non volere che siano disponibili in tutte le istanze), ma ancora nessuna lingua di cui sono a conoscenza supporta tale caratteristica.

Problemi correlati