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, SineWaveGenerator
e SquareWaveGenerator
).
Voglio implementare una classe che genera una SoundWave
basata 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 IWaveGenerator
funzionalità per creare di SoundWave
conseguenza.
La domanda è: dovrebbe NoteGenerator
contenere IWaveGenerator
o dovrebbe ereditare da IWaveGenerator
un'implementazione?
Mi sto orientando verso la composizione per due motivi:
1- Mi permette di iniettare qualsiasi IWaveGenerator
al NoteGenerator
modo dinamico. Inoltre, ho solo bisogno di una NoteGenerator
classe, invece di SineNoteGenerator
, SquareNoteGenerator
ecc
2- Non è necessario NoteGenerator
esporre 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 IWaveGenerator
perché genera SoundWave
s.