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, SineWaveGenerator
e SquareWaveGenerator
).
Quero implementar uma classe que gere uma SoundWave
base 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 IWaveGenerator
funcionalidade para criar uma SoundWave
conformidade.
A questão é: deve NoteGenerator
conter IWaveGenerator
ou deve herdar de uma IWaveGenerator
implementação?
Estou me inclinando para a composição por dois motivos:
1- Ele me permite injetar qualquer IWaveGenerator
à NoteGenerator
dinamicamente. Além disso, eu só preciso de uma NoteGenerator
classe, em vez de SineNoteGenerator
, SquareNoteGenerator
, etc.
2- Não há necessidade de NoteGenerator
expor 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 IWaveGenerator
porque gera SoundWave
s.