Розглянемо інтерфейс:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Цей інтерфейс реалізований низкою класів, які генерують хвилі різної форми (наприклад, SineWaveGenerator
та SquareWaveGenerator
).
Я хочу реалізувати клас, який формує на SoundWave
основі музичних даних, а не необроблених звукових даних. Він отримав би назву ноти та довжину у перерахунку на удари (не секунди), а внутрішньо використовувати IWaveGenerator
функціонал для створення SoundWave
відповідно.
Питання полягає в тому, чи повинен NoteGenerator
містити IWaveGenerator
або повинен успадковувати його IWaveGenerator
імплементацію?
Я схиляюся до складу через дві причини:
1- Це дозволяє мені вводити будь- IWaveGenerator
які NoteGenerator
динамічно. Крім того , мені потрібен тільки один NoteGenerator
клас, замість SineNoteGenerator
, SquareNoteGenerator
і т.д.
2- Не потрібно NoteGenerator
виставляти інтерфейс нижнього рівня, визначений IWaveGenerator
.
Однак я розміщую це питання, щоб почути інші думки щодо цього, можливо, моменти, про які я не замислювався.
BTW: Я б сказав, що NoteGenerator
це концептуально, IWaveGenerator
тому що він породжує SoundWave
s.