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, SineWaveGenerator
et SquareWaveGenerator
).
Je veux implémenter une classe qui génère un SoundWave
basé 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 IWaveGenerator
fonctionnalité pour créer un en SoundWave
conséquence.
La question est de savoir si le doit NoteGenerator
contenir IWaveGenerator
ou doit-il hériter d'une IWaveGenerator
implémentation?
Je penche vers la composition pour deux raisons:
1- Il me permet d'injecter tout IWaveGenerator
le NoteGenerator
dynamique. En outre, je ne ai besoin d' une NoteGenerator
classe, au lieu de SineNoteGenerator
, SquareNoteGenerator
etc.
2- Il n'est pas nécessaire NoteGenerator
d'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 IWaveGenerator
parce qu'il génère l' SoundWave
art.