Рассмотрим интерфейс:
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
.
Однако я публикую этот вопрос, чтобы услышать другие мнения по этому поводу, может быть, пункты, о которых я не задумывался.
Кстати, я бы сказал NoteGenerator
, концептуально, IWaveGenerator
потому что он генерирует SoundWave
s.