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, SineWaveGeneratory SquareWaveGenerator).
Quiero implementar una clase que genere SoundWavedatos 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 IWaveGeneratorfuncionalidad para crear un SoundWaveacorde.
La pregunta es, ¿debería NoteGeneratorcontener IWaveGeneratoro debería heredar de una IWaveGeneratorimplementación?
Me inclino por la composición por dos razones:
1- Me permite inyectar cualquiera IWaveGeneratora la NoteGeneratordinámica. Además, sólo necesito una NoteGeneratorclase, en lugar de SineNoteGenerator, SquareNoteGenerator, etc.
2- No es necesario NoteGeneratorexponer 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 IWaveGeneratorporque genera SoundWaves.