Quando e perché dovresti inserire un nuovo metodo in un'interfaccia invece di una classe base astratta?

3

Mi è stata posta la seguente domanda in un'intervista: "Qual è la necessità di un'interfaccia quando puoi avere un metodo astratto all'interno di una classe astratta?" Di cui non sapevo la risposta.

Potresti fornire un esempio per quale motivo e quando può essere utile?

    
posta Anand 07.02.2016 - 16:04
fonte

3 risposte

7

Non è possibile utilizzare l'ereditarietà multipla con classi astratte in C #. Ma è possibile derivare da più interfacce, il che porta a scenari in cui può essere necessario utilizzare un'interfaccia invece di una classe astratta per un nuovo metodo.

    
risposta data 07.02.2016 - 16:20
fonte
3

Oltre a non essere in grado di utilizzare l'ereditarietà multipla, come ha sottolineato Robert Harvey, quando si usa una classe astratta, lo si fa in genere per raggruppare il comportamento comune dei bambini di questo supertipo insieme, rispettando DRY principio.

Ma così facendo, a volte stai introducendo più dati nella classe di quanto probabilmente la singola interfaccia dovrebbe avere per funzionare (non sempre, ma può succedere).

Questo porta alla necessità di istanziare classi più grandi del possibile per utilizzarlo per un compito molto semplice, perché è necessario passare la classe astratta, invece di avere un'interfaccia e una classe più semplice, fornendo l'implementazione con solo i dettagli necessari per adempiere al contratto.

    
risposta data 07.02.2016 - 16:28
fonte
3

Quando un'API utilizza una classe base astratta, il (solo) modo di fornire una versione di tale API è di creare una sottoclasse della classe base astratta.

Perché in C # e in Java possiamo avere solo una super classe, è, in un certo senso, una risorsa scarsa. Richiedere che ogni sottoclasse di implementatore dell'API da quella classe base astratta significhi che non possono sottoclasse da una classe di loro scelta. (Ciò significa che la sottoclasse sarà quindi una nuova classe per ciascun implementatore e che probabilmente dovrà agire come proxy per un'altra classe nella loro gerarchia.)

Quando un'API utilizza un'interfaccia, ciascun implementatore può scegliere qualsiasi classe base che desidera. Ciò significa, ad esempio, che possono implementare l'interfaccia da una classe esistente nella loro gerarchia di classi.

Pertanto, le interfacce risultano in un accoppiamento più flessibile (tra le gerarchie di classi) e una maggiore libertà di implementazione.

(Ci sono ulteriori cose da dire sull'accoppiamento più stretto se la classe astratta fornisce qualsiasi implementazione, ad esempio qualcosa oltre il metodo astratto).

    
risposta data 07.02.2016 - 17:11
fonte

Leggi altre domande sui tag