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. SineWaveGenerator
und SquareWaveGenerator
).
Ich möchte eine Klasse implementieren, die SoundWave
basierend 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 IWaveGenerator
Funktionalität intern verwenden , um eine SoundWave
entsprechende Note zu erstellen .
Die Frage ist, sollte das eine NoteGenerator
enthalten IWaveGenerator
oder sollte es von einer IWaveGenerator
Implementierung erben ?
Ich neige aus zwei Gründen zur Komposition:
1- Es erlaubt mir , jeden zu injizieren , IWaveGenerator
um die NoteGenerator
dynamisch. Auch ich brauche nur eine NoteGenerator
Klasse, statt SineNoteGenerator
, SquareNoteGenerator
usw.
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, IWaveGenerator
weil es SoundWave
s erzeugt .