Pertimbangkan sebuah antarmuka:
interface IWaveGenerator
{
SoundWave GenerateWave(double frequency, double lengthInSeconds);
}
Antarmuka ini diimplementasikan oleh sejumlah kelas yang menghasilkan gelombang dengan bentuk yang berbeda (misalnya, SineWaveGenerator
dan SquareWaveGenerator
).
Saya ingin menerapkan kelas yang menghasilkan SoundWave
berdasarkan pada data musik, bukan data suara mentah. Itu akan menerima nama catatan dan panjang dalam hal ketukan (bukan detik), dan secara internal menggunakan IWaveGenerator
fungsi untuk membuat yang SoundWave
sesuai.
Pertanyaannya adalah, haruskah NoteGenerator
mengandung IWaveGenerator
atau mewarisi dari IWaveGenerator
implementasi?
Saya condong ke arah komposisi karena dua alasan:
1- Ini memungkinkan saya untuk menyuntikkan apapun IWaveGenerator
ke NoteGenerator
dinamis. Juga, saya hanya perlu satu NoteGenerator
kelas, bukan SineNoteGenerator
, SquareNoteGenerator
, dll
2- Tidak perlu untuk NoteGenerator
mengekspos antarmuka tingkat bawah yang ditentukan oleh IWaveGenerator
.
Namun saya memposting pertanyaan ini untuk mendengar pendapat lain tentang ini, mungkin poin yang belum saya pikirkan.
BTW: Saya akan mengatakan NoteGenerator
secara konseptual IWaveGenerator
karena menghasilkan SoundWave
s.