2011-11-03 8 views
6

Ho cercato tra i numerosi messaggi di S/O e non ho trovato una risposta che mi aiuti.
Mi piacerebbe avere una visione mentale di cosa sia una classe astratta e che cos'è un'interfaccia. Ho letto questo post Real world abstract class usage simple samples, ma non sono ancora chiaro sui concetti.Cercando di ottenere un concetto di mondo reale di Abstract class vs Interface in asp.net

Spero che qualcuno possa descrivere un mondo reale sotto forma di oggetto "Persona". Quindi eredità sarebbe "Persona" -> "Dipendente" -> "Manager"
e ridefinendo sarebbe "lo stipendio di dipendente" sarebbe diventato "Le vendite dipendente commissione"

Come posso descrivere una classe astratta e di un interfaccia all'interno di un concetto di oggetto Persona?

risposta

9

Ci sono diversi punti di vista sull'argomento dell'uso di un'interfaccia contro una classe astratta. Un'interfaccia, tuttavia, dovrebbe esprimere il comportamento di un oggetto (cosa può fare) e la classe astratta dovrebbe definire di cosa si tratta. Fondamentalmente "I can" contro "I am" dalla persepettiva dell'oggetto.

Quindi, se abbiamo una Persona, questo è un nome e quindi useremo una classe astratta per definirlo. Qualsiasi cosa che "è una" persona erediterà da quella classe. Se vogliamo definire un comportamento che descrive un comportamento che la persona è capace non estende a tutte le persone, dovremmo metterlo in un'interfaccia.

Utilizzando la relazione che è stata definita (Persona -> Dipendente -> Manager), possiamo dire che il Dipendente implementa IFable e il Gestore implementa IFirer. Il dipendente può essere licenziato e il manager può licenziare un dipendente.

+0

Buona analogia. Stai dicendo che la Persona è una classe astratta? – DotNetRookie

+1

@DotNetCookie - Non voglio davvero dire si o no a quello. Tutto dipende dal contesto del problema che stai cercando di risolvere. Se è necessario essere in grado di creare un'istanza di un oggetto "semplice", allora non avrebbe molto senso. In questo caso (Person -> Employee -> Manager) potrebbe avere senso creare la classe base, Person, abstract. –

+1

Il comportamento che userei per un'interfaccia con Person è IEat, che potrebbe dichiarare un metodo Feed. Il punto è che le interfacce si intersecano, quindi Mammal: IEat> Person> etc. e PlantLife: IEat> Cactus, quindi una persona non è una PlantLife (un po 'come questo) ma mangiano tutti in qualche modo. –

4

Mi scuso per il fatto che non sto usando il tuo esempio di persona, per favore prendi questo solo come commento esteso.

Trovo più facile spiegare i concetti, a persone senza background di programmazione, usando un'analogia con qualcosa che la maggior parte delle persone già comprende: Stampaggio plastica!

Diciamo che stiamo facendo frutta di plastica, per esempio:

Un'interfaccia è come lo stampo, ha la forma del prodotto finale, ma si può riempire con tutti i tipi di colori e materiali diversi. Avranno tutti la stessa forma alla fine, anche se sono completamente diversi per colore e consistenza.

Una classe astratta sarebbe più simile a qualcosa che richiede un ulteriore passaggio, come la pittura. Crei il frutto di plastica di base, poi lo spedisci per ottenere un dipinto o una pelliccia incollati o qualcosa del genere.

Il frutto incompiuto è come una classe astratta in quanto ha più definizione del prodotto finale che lo stampo, ma di per sé non è completo. Ha bisogno di più lavoro da completare, e i prodotti finali potrebbero essere completamente diversi colori, ma sono ancora fondamentalmente gli stessi.

Spero che questo aiuti!

4

OK, vediamo se ho capito la tua domanda ...

Credo che la vostra conceptaully sicuri delle differenze e/o analogie tra l'uso di interfacce e classi astratte.Se questo è il problema, ecco il mio riassunto "iniziatore per 10";

classi astratte smussano essere istanziati, ma possono contenere dettagli di implementazione, in modo che quando deriva una classe da quello che si ottiene il contratto e qualsiasi comportamento predefinito si mette in classe astratta. Ad esempio la tua classe Person (presumo che sia una classe astratta per questo esempio) definisca il contratto che una Employee o Manager derivata deve avere (almeno), ma può anche fornire un comportamento predefinito.

Interfacce d'altra parte specificare solo il contratto; ciò che le classi di implementazione devono fare, non possono fornire alcun tipo di implementazione. Ad esempio se la "Persona" nel tuo esempio è stata infatti un'interfaccia che definirà le classi che la implementano (Dipendente e Manager) deve fare, ma non può fornire alcuna implementazione predefinita per quel contratto.

Si noti inoltre che in molte lingue (Java, C#, Delphi) è possibile ereditare da una sola classe genitore, ma è possibile implementare molte interfacce.

Problemi correlati