Considera un'interfaccia:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Questa interfaccia è implementata da un numero di classi che generano onde di forme diverse (ad esempio, SineWaveGenerator e SquareWaveGenerator ).
Voglio implementare una classe che genera un SoundWave basato su dati musicali, non dati grezzi. Riceverà il nome di una nota e una lunghezza in termini di battiti (non secondi) e utilizzerà internamente la funzionalità IWaveGenerator per creare un SoundWave di conseguenza.
La domanda è, se il NoteGenerator contiene un IWaveGenerator o dovrebbe ereditare da un'implementazione IWaveGenerator ?
Sono propenso alla composizione per due motivi:
1- Mi permette di iniettare qualsiasi IWaveGenerator alla NoteGenerator in modo dinamico. Inoltre, ho solo bisogno di una classe NoteGenerator , invece di SineNoteGenerator , SquareNoteGenerator , ecc.
2 Non è necessario che NoteGenerator esponga l'interfaccia di livello inferiore definita da IWaveGenerator .
Tuttavia sto postando questa domanda per ascoltare altre opinioni riguardo questo, forse punti a cui non ho pensato.
BTW: direi NoteGenerator è concettualmente un IWaveGenerator perché genera SoundWave s.