Prendi in considerazione un'interfaccia:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Questa interfaccia è implementata da un numero di classi che generano ondate di forme diverse (ad esempio, SineWaveGeneratore SquareWaveGenerator).
Voglio implementare una classe che genera una SoundWavebasata su dati musicali, non su dati audio grezzi. Riceverà il nome di una nota e una lunghezza in termini di battute (non secondi) e utilizzerà internamente la IWaveGeneratorfunzionalità per creare di SoundWaveconseguenza.
La domanda è: dovrebbe NoteGeneratorcontenere IWaveGeneratoro dovrebbe ereditare da IWaveGeneratorun'implementazione?
Mi sto orientando verso la composizione per due motivi:
1- Mi permette di iniettare qualsiasi IWaveGeneratoral NoteGeneratormodo dinamico. Inoltre, ho solo bisogno di una NoteGeneratorclasse, invece di SineNoteGenerator, SquareNoteGeneratorecc
2- Non è necessario NoteGeneratoresporre l'interfaccia di livello inferiore definita da IWaveGenerator.
Tuttavia sto pubblicando questa domanda per ascoltare altre opinioni in merito, forse punti a cui non ho pensato.
A proposito: direi che NoteGenerator è concettualmente un IWaveGeneratorperché genera SoundWaves.