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 SineWaveGenerator
i SquareWaveGenerator
).
Chcę zaimplementować klasę, która generuje SoundWave
dane 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 IWaveGenerator
funkcji, aby odpowiednio ją utworzyć SoundWave
.
Pytanie brzmi: czy powinien NoteGenerator
zawierać IWaveGenerator
lub powinien dziedziczyć z IWaveGenerator
implementacji?
Skłaniam się do kompozycji z dwóch powodów:
1- Pozwala mi IWaveGenerator
to NoteGenerator
dynamicznie wstrzykiwać dowolne . Ponadto, muszę tylko jedną NoteGenerator
klasę, zamiast SineNoteGenerator
, SquareNoteGenerator
itp
2- Nie ma potrzeby NoteGenerator
ujawniania 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, IWaveGenerator
ponieważ generuje SoundWave
s.