Una classe astratta dovrebbe sempre astrarre i suoi metodi su un'interfaccia?

1

Ho imparato qualche tempo fa che le classi astratte dovrebbero sempre astrarre le loro funzioni in un'interfaccia. Quindi, invece di avere qualcosa di simile -

abstract class a{
    public int i;
    public int foo();
}

class b : a{
    public int foo(){return 42;}
}

abbiamo qualcosa di simile -

interface Ia{
    public int foo();
}

abstract class a : Ia{
    public int i;
}

class b : a{
    public int foo(){return 42;}
}

Dal mio punto di vista, questo è migliore a causa della singola responsabilità, modularità e manutenibilità. Tuttavia, il mio collega non è d'accordo, e afferma che non vi è alcun vantaggio percepibile a questo e che non fa che aumentare la complessità. Ho provato a trovare alcuni scritti su questo argomento, ma non ricordo il nome del pattern e il mio googling non ha trasformato nulla.

Questo modello è una cosa reale? Avevo ragione ad astrarre tutto il più possibile, o è corretto il mio collega?

    
posta David Grinberg 23.07.2014 - 21:23
fonte

2 risposte

6

Entrambi possono essere corretti. In generale, il tuo approccio rientra nel campo di applicazione del principio di segregazione dell'interfaccia e la sua caduta sotto di te non sta per averne bisogno.

Secondo la mia esperienza, dipende da cosa è l'interfaccia. Rappresenta una cosa concreta o rappresenta un tratto di una varietà di cose?

Se rappresenta una cosa concreta, lasciala semplicemente come classe astratta. Rendendolo un'interfaccia, le persone si moltiplicano per implementarlo, violando il Principio di Responsabilità Unico, dal momento che stai mescolando la tua cosa concreta e qualche altra cosa.

Se rappresenta un tratto che è contenuto da una varietà di cose, allora rendilo un'interfaccia. L'interfaccia modella meglio il tratto e lascia che una varietà di cose soddisfi l'interfaccia.

Non creare interfacce perché "devi". Crea interfacce perché modellano correttamente il tuo dominio problematico.

    
risposta data 23.07.2014 - 21:38
fonte
1

Nessuno dei due. Classi e interfacce astratte non sono sostituibili. Se la tua classe ha un'operazione binaria (cioè, controlla i campi privati di un'altra istanza della sua classe), questo semplicemente non può essere fatto da un'interfaccia (perché un'interfaccia nasconde la sua implementazione). Questo è il motivo per cui, ad esempio, non viene visualizzata un'operazione unione / unione nell'interfaccia Set di Java.

Tuttavia, se hai bisogno di implementazioni multiple di un tipo, allora usare le interfacce è sicuramente l'approccio migliore quando applicabile. Non puoi ereditare le classi in modo multiplo, quindi non appena avrai bisogno di qualcosa con foo e bar , sarai affondato. Puoi sempre implementare più interfacce e riutilizzare il comportamento con la composizione.

    
risposta data 23.07.2014 - 21:30
fonte