Mentre alcune linee guida indicano che è necessario utilizzare un'interfaccia quando si desidera definire un contratto per una classe in cui l'ereditarietà non è chiara (IDomesticated
) e l'ereditarietà quando la classe è un'estensione di un'altra (Cat : Mammal
, Snake : Reptile
), ci sono casi in cui (secondo me) queste linee guida entrano in un'area grigia.Quando utilizzare le interfacce o classi astratte? Quando usare entrambi?
Ad esempio, supponiamo che la mia implementazione sia stata Cat : Pet
. Pet
è una classe astratta. Dovrebbe essere esteso a Cat : Mammal, IDomesticated
dove Mammal
è una classe astratta e IDomesticated
è un'interfaccia? O sono in conflitto con i principi KISS/YAGNI (anche se non sono sicuro se ci sarà una classe Wolf
in futuro, che non sarebbe in grado di ereditare da Pet
)?
Allontanarsi dalla metaforica Cat
s e Pet
s, diciamo che ho alcune classi che rappresentano le fonti per i dati in entrata. Tutti hanno bisogno di implementare la stessa base in qualche modo. Potrei implementare qualche codice generico in una classe astratta Source
e ereditare da esso. Potrei anche creare un'interfaccia ISource
(che mi sembra più "giusta") e ri-implementare il codice generico in ogni classe (che è meno intuitivo). Alla fine, potevo "avere la torta e mangiarla" facendo sia la classe astratta che l'interfaccia. Cosa c'è di meglio?
Questi due casi richiamano i punti per l'utilizzo solo di una classe astratta, solo un'interfaccia e utilizzando sia una classe astratta che un'interfaccia. Sono tutte scelte valide o ci sono "regole" per quando uno dovrebbe essere usato rispetto ad un altro?
vorrei precisare che per "utilizzando sia una classe astratta e un'interfaccia" che include il caso in cui essi rappresentano essenzialmente la stessa cosa (Source
e ISource
entrambi hanno gli stessi membri), ma la classe aggiunge funzionalità generiche mentre l'interfaccia specifica il contratto.
Vale anche la pena notare che questa domanda riguarda principalmente le lingue che non supportano l'ereditarietà multipla (come .NET e Java).
Mi piacerebbe notare che ho visto diverse domande "Interface vs. Abstract classes", ma in questa domanda, sono più interessato a quando usare * both * interfacce e classi astratte (se questo è una cosa valida da fare.) – Blixt
possibile duplicato di [Interface vs Abstract Class (OO generale)] (http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo) –
possibile duplicato di [Quando utilizzare un'interfaccia invece di una classe astratta e viceversa?] (Http://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and -vice-versa) – nawfal