Рассмотрим интерфейс:
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потому что он генерирует SoundWaves.