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.