Domanda

Mi chiedo se ci siano differenze nelle classi derivate quando si usano le classi astratte vs reali per l'ereditarietà?

Mi sembra che l'eredità delle classi reali crei una gerarchia, mentre l'ereditarietà delle classi astratta è solo il codice copia-incolla per il compilatore in classi derivate?

La classe astratta crea una gerarchia? È possibile accedervi utilizzando una parola chiave speciale?

So che usi la parola chiave base per accedere alla classe base, ma i membri astratti assomigliano ai membri originali nelle classi derivate?

Infine, qual è la differenza di prestazioni tra i 2?

È stato utile?

Soluzione

Sì, esiste la classe astratta - il compilatore non esegue un copia-incolla. Non troverete alcuna differenza di prestazioni, poiché il CLR deve ancora effettuare chiamate al metodo virtuale.

Ad esempio il seguente C #:

abstract class Foo { }

class Bar : Foo { }

genera il seguente IL:

.class private abstract auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object { }

.class private auto ansi beforefieldinit Bar
    extends Foo { }

Il concetto di un tipo astratto fa molto parte dell'IL.

Altri suggerimenti

L'unica differenza è che una classe base astratta non può essere istanziata senza essere derivata, mentre una classe non astratta può farlo. Dal punto di vista di una classe derivata, tutto è uguale.

Classi astratte e classi concrete sono entrambi strumenti per la modellazione (OO). Non vi è alcuna differenza per quanto riguarda le regole di eredità e sostituzione. Ci sono alcuni aspetti tecnici:

  • Una classe astratta non può essere istanziato
  • I metodi astratti sono consentito solo in classi astratte

Ma una classe astratta può avere metodi, proprietà e campi non astratti.

Le prestazioni non sono correlate alle classi ma c'è una piccola penalità per i metodi astratti / virtuali.

Il potere della classe astratta sta nella sua non attuazione. Può essere utilizzato per sicurezza che l'istanza di classi derivate avrà la piena funzionalità necessaria

La classe astratta è una forma primitiva di una classe base. Questi non possono essere istanziati, il che significa che lo sviluppatore deve derivare da queste classi per utilizzare la loro funzionalità. Qualsiasi metodo astratto definito nella classe astratta deve essere implementato nella sua classe figlio. Quindi si possono implementare metodi che devono essere presenti nella classe figlio che deriva dalla classe astratta. Quindi definisci gli elementi di base di un oggetto che può essere personalizzato dallo sviluppatore in una classe derivata a suo piacimento.

Le classi non astratte sono utilizzate al meglio per estendere una funzionalità di classe mentre continuano anche a usare ciò che è nella classe non astratta. Tutti i membri e i metodi non privati ??sono accessibili dalla classe derivata.

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