Betrachten Sie eine Schnittstelle:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Diese Schnittstelle wird von einer Reihe von Klassen implementiert, die Wellen unterschiedlicher Form erzeugen (z. B. SineWaveGeneratorund SquareWaveGenerator).
Ich möchte eine Klasse implementieren, die SoundWavebasierend auf Musikdaten und nicht auf Rohtondaten generiert . Es würde den Namen einer Note und eine Länge in Beats (nicht Sekunden) erhalten und die IWaveGeneratorFunktionalität intern verwenden , um eine SoundWaveentsprechende Note zu erstellen .
Die Frage ist, sollte das eine NoteGeneratorenthalten IWaveGeneratoroder sollte es von einer IWaveGeneratorImplementierung erben ?
Ich neige aus zwei Gründen zur Komposition:
1- Es erlaubt mir , jeden zu injizieren , IWaveGeneratorum die NoteGeneratordynamisch. Auch ich brauche nur eine NoteGeneratorKlasse, statt SineNoteGenerator, SquareNoteGeneratorusw.
2- Es ist nicht erforderlich NoteGenerator, die durch definierte untergeordnete Schnittstelle freizulegen IWaveGenerator.
Allerdings poste ich diese Frage, um andere Meinungen dazu zu hören, vielleicht Punkte, an die ich nicht gedacht habe.
Übrigens: Ich würde sagen, es NoteGenerator ist konzeptionell ein, IWaveGeneratorweil es SoundWaves erzeugt .