2013-05-29 14 views
15

Un intervistatore mi ha chiesto la seguente domanda e non ho potuto rispondere:Perché abbiamo bisogno di interfacce quando esistono classi astratte?

Perché abbiamo bisogno di interfacce quando esistono classi astratte?

Indipendentemente dai metodi che stiamo scrivendo nell'interfaccia, possiamo scrivere anche in Abstract. Allora perché abbiamo bisogno di interfacce separate?

Qualcuno può dirmi per quale motivo?

Advance, grazie ...

+6

Si pensa a molteplici ereditarietà, è possibile implementare più interfacce ma è possibile ereditare solo una classe in C# –

+2

Dal punto di vista Java, le classi astratte sono per gerarchia di ereditarietà, le interfacce per il contratto di implementazione. – NINCOMPOOP

+1

Le interfacce sono inoltre preziose per gli scenari di iniezione delle dipendenze e di unità. Le astratte classi base possono ancora contenere la logica e, di conseguenza, non possono essere completamente ridicolizzate negli scenari di test. – mclark1129

risposta

15

ci sono molte differenze,

  • classi astratte possono avere solo una classe padre, mentre una classe può implementare diverse interfacce.
  • Le interfacce non possono contenere alcuna implementazione, le classi astratte possono (possono avere metodi astratti oltre a metodi non astratti).

Le interfacce sono ottime per concentrarsi su una "vista" che possiamo avere su una classe. Questa vista può essere condivisa da più classi che implementano l'interfaccia.

Ad esempio, DataTable implementa IListSource e ISerializable. Quindi, a seconda del contesto, è possibile visualizzarlo come sorgente di una lista per leggere i suoi dati o come classe in cui le istanze possono essere serializzate. Quando lo fai, ti concentri su una vista specifica che puoi avere di un'istanza.

+0

Non sono pienamente convinto da questa risposta .. Il linguaggio potrebbe essere stato progettato per consentire l'ereditarietà multipla, e non avrebbe interfacce obsolete. Non essere in grado di derivare da più di una classe astratta non è un motivo per scegliere un'interfaccia su una classe o viceversa. – Daniel

+0

@Daniel, sono d'accordo, ho appena evidenziato una delle differenze più odiose –

10

L'interfaccia rappresenta un contratto, mentre è possibile avere diverse implementazioni di tale contratto in diverse classi (astratte).

public interface IExample 
{ 
    void Do(); 
} 

public abstract class DoFirst : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the first way"); 
    } 
} 

public abstract class DoSecond : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the second way"); 
    } 
} 

public class DoFirstConcrete : DoFirst, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with first."); 
    } 
} 

public class DoSecondConcrete : DoSecond, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with second."); 
    } 
} 
8

La classe astratta è un'implementazione parziale. Le interfacce sono contratti, per sapere cosa può fare la tua classe astratta. Hai bisogno di un'interfaccia per descriverlo.

3

È possibile implementare più interfacce, ma ereditare solo da una classe astratta.

Un'interfaccia è una shell vuota, ci sono solo le firme (nome/parametri/tipo di ritorno) dei metodi. I metodi non contengono nulla. L'interfaccia non può fare nulla. È solo uno schema

Le classi astratte, a differenza delle interfacce, sono classi. Ci sono più costosi da usare perché c'è una ricerca da fare quando si eredita da loro.

Le classi astratte assomigliano molto alle interfacce, ma hanno qualcosa in più: è possibile definire un comportamento per loro. Si tratta più di un ragazzo che dice "queste classi dovrebbero assomigliare a questo, e hanno ottenuto ciò in comune, quindi riempire gli spazi vuoti!".

Citato e-satis da qui (molte più informazioni troppo): What is the difference between an interface and abstract class?

0

Non si può ereditare da più classi astratte, ma è possibile implementare interfacce multiple.

Problemi correlati