Rozważ interfejs:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Interfejs ten jest implementowany przez wiele klas, które generują fale o różnych kształtach (na przykład SineWaveGeneratori SquareWaveGenerator).
Chcę zaimplementować klasę, która generuje SoundWavedane muzyczne, a nie surowe dane dźwiękowe. Otrzyma nazwę nuty i długość wyrażoną w uderzeniach (nie sekundach) i wewnętrznie użyje tej IWaveGeneratorfunkcji, aby odpowiednio ją utworzyć SoundWave.
Pytanie brzmi: czy powinien NoteGeneratorzawierać IWaveGeneratorlub powinien dziedziczyć z IWaveGeneratorimplementacji?
Skłaniam się do kompozycji z dwóch powodów:
1- Pozwala mi IWaveGeneratorto NoteGeneratordynamicznie wstrzykiwać dowolne . Ponadto, muszę tylko jedną NoteGeneratorklasę, zamiast SineNoteGenerator, SquareNoteGeneratoritp
2- Nie ma potrzeby NoteGeneratorujawniania interfejsu niższego poziomu zdefiniowanego przez IWaveGenerator.
Jednak zamieszczam to pytanie, aby usłyszeć inne opinie na ten temat, być może kwestie, o których nie myślałem.
BTW: Powiedziałbym, że NoteGenerator jest koncepcyjnie, IWaveGeneratorponieważ generuje SoundWaves.