Considere uma interface:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Essa interface é implementada por várias classes que geram ondas de diferentes formas (por exemplo, SineWaveGeneratore SquareWaveGenerator).
Quero implementar uma classe que gere uma SoundWavebase em dados musicais, não em dados brutos de som. Ele receberia o nome de uma nota e um comprimento em termos de batidas (não segundos) e usaria internamente a IWaveGeneratorfuncionalidade para criar uma SoundWaveconformidade.
A questão é: deve NoteGeneratorconter IWaveGeneratorou deve herdar de uma IWaveGeneratorimplementação?
Estou me inclinando para a composição por dois motivos:
1- Ele me permite injetar qualquer IWaveGeneratorà NoteGeneratordinamicamente. Além disso, eu só preciso de uma NoteGeneratorclasse, em vez de SineNoteGenerator, SquareNoteGenerator, etc.
2- Não há necessidade de NoteGeneratorexpor a interface de nível inferior definida por IWaveGenerator.
No entanto, estou postando esta pergunta para ouvir outras opiniões sobre isso, talvez pontos em que não pensei.
BTW: Eu diria que NoteGenerator é conceitualmente um IWaveGeneratorporque gera SoundWaves.