Considérez une interface:
interface IWaveGenerator
{
    SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Cette interface est implémentée par un certain nombre de classes qui génèrent des vagues de formes différentes (par exemple, SineWaveGeneratoret SquareWaveGenerator).
Je veux implémenter une classe qui génère un SoundWavebasé sur des données musicales, pas des données sonores brutes. Il recevrait le nom d'une note et une longueur en termes de battements (pas de secondes), et utiliserait en interne la IWaveGeneratorfonctionnalité pour créer un en SoundWaveconséquence.
La question est de savoir si le doit NoteGeneratorcontenir IWaveGeneratorou doit-il hériter d'une IWaveGeneratorimplémentation?
Je penche vers la composition pour deux raisons:
1- Il me permet d'injecter tout IWaveGeneratorle NoteGeneratordynamique. En outre, je ne ai besoin d' une NoteGeneratorclasse, au lieu de SineNoteGenerator, SquareNoteGeneratoretc.
2- Il n'est pas nécessaire NoteGeneratord'exposer l'interface de niveau inférieur définie par IWaveGenerator.
Cependant, je poste cette question pour entendre d'autres opinions à ce sujet, peut-être des points auxquels je n'ai pas pensé.
BTW: Je dirais que NoteGenerator c'est conceptuellement un IWaveGeneratorparce qu'il génère l' SoundWaveart.