Hãy xem xét một giao diện:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Giao diện này được thực hiện bởi một số lớp tạo ra các sóng có hình dạng khác nhau (ví dụ, SineWaveGeneratorvà SquareWaveGenerator).
Tôi muốn thực hiện một lớp tạo ra SoundWavedựa trên dữ liệu âm nhạc, không phải dữ liệu âm thanh thô. Nó sẽ nhận được tên của một nốt nhạc và độ dài theo nhịp (không phải giây) và sử dụng IWaveGeneratorchức năng bên trong để tạo ra một nốt nhạc SoundWavephù hợp.
Câu hỏi là, nó có nên NoteGeneratorchứa IWaveGeneratorhoặc nên kế thừa từ một IWaveGeneratortriển khai?
Tôi nghiêng về sáng tác vì hai lý do:
1- Nó cho phép tôi tiêm bất kỳ IWaveGeneratorvào NoteGeneratorđộng. Ngoài ra, tôi chỉ cần một NoteGeneratorlớp, thay vì SineNoteGenerator, SquareNoteGeneratorvv
2- Không cần phải NoteGeneratorlộ giao diện cấp thấp hơn được xác định bởi IWaveGenerator.
Tuy nhiên tôi đang đăng câu hỏi này để nghe ý kiến khác về vấn đề này, có thể những điểm tôi chưa nghĩ đến.
BTW: Tôi muốn nói NoteGenerator là về mặt khái niệm IWaveGeneratorbởi vì nó tạo ra SoundWaves.