Considere una interfaz:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Esta interfaz se implementa mediante una serie de clases que generan ondas de diferentes formas (por ejemplo, SineWaveGenerator
y SquareWaveGenerator
).
Quiero implementar una clase que genere SoundWave
datos basados en datos musicales, no en sonido sin formato. Recibiría el nombre de una nota y una duración en términos de latidos (no segundos), y utilizaría internamente la IWaveGenerator
funcionalidad para crear un SoundWave
acorde.
La pregunta es, ¿debería NoteGenerator
contener IWaveGenerator
o debería heredar de una IWaveGenerator
implementación?
Me inclino por la composición por dos razones:
1- Me permite inyectar cualquiera IWaveGenerator
a la NoteGenerator
dinámica. Además, sólo necesito una NoteGenerator
clase, en lugar de SineNoteGenerator
, SquareNoteGenerator
, etc.
2- No es necesario NoteGenerator
exponer la interfaz de nivel inferior definida por IWaveGenerator
.
Sin embargo, estoy publicando esta pregunta para escuchar otras opiniones al respecto, tal vez puntos en los que no he pensado.
Por cierto: diría que NoteGenerator
es conceptualmente IWaveGenerator
porque genera SoundWave
s.